2011-11-20 30 views
20

qual è la differenza (se c'è) fraCoffeeScript “Array()” vs “new Array()”

x = Array() 

e

x = new Array() 

in CoffeeScript (o JavaScript a tal fine)? Quale dovrei usare?

+0

È possibile trovare questo interessante: http://stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful – nickd

risposta

29

Il spec dice:

Quando Array è chiamato come una funzione piuttosto che come un costruttore, si crea e inizializza un nuovo oggetto Array. Pertanto la funzione chiamata Array(…) equivale all'espressione di creazione dell'oggetto new Array(…) con gli stessi argomenti.

5

Credo che entrambi siano equivalenti. Tuttavia, in JavaScript, almeno, si dovrebbe sempre usare la sintassi letterale:

x = [] 

Ma sulla base di alcuni test nei browser che ho, Array(1, 2, 3) dà lo stesso risultato di new Array(1, 2, 3), e lo stesso con Array(15) e new Array(15). O semplicemente semplice new Array().

+0

corretto, ci sono lo stesso esatto. – Raynos

+0

Probabilmente dovresti usare 'x = []' sia in JavaScript che in CoffeeScript a meno che non sia necessario pre-dimensionare l'array per qualche motivo. –

+0

mu ha esattamente ragione: usa 'arr = new Array (n)' (dove 'n' è un numero) se e solo se stai facendo qualcosa di intensivo in termini di prestazioni dove sai quanto grande sarà la matrice in anticipo, quindi la memoria richiesta viene allocata tutto in una volta (in linea di principio). –

9

È necessario utilizzare il valore letterale []. I motivi sono indicati here. Utilizzando il costruttore Array() può essere ambigua, in quanto accetta sia un length o un elenco di elementi:

new Array(5) // [] 
new Array('5') // ['5'] 

[5] // [5] 
['5'] // ['5'] 

La ragione per cui è possibile utilizzare Array senza che l'operatore new è che internamente fa un trucco comune con i costruttori:

function Thing(){ 
    if (!(this instanceof Thing)){ 
     return new Thing() 
    } 
    // ... define object 
} 

Cioè, se si chiama Thing() chiamerà per voi new Thing().