2013-07-24 7 views
7

L'aggiunta di una proprietà a un array con notazione punto lo modifica in un oggetto?modifica di un array in un oggetto (maiuscolo) aggiungendo un valore utilizzando un punto

var arr = []; 

arr.something = "test"; 

è un array?

Io non la penso così, ma underscore.js dice che è

console.log(_.isArray(arr)); //true 

http://jsfiddle.net/wZcyG/

+1

Ecco il codice con cui si sta lavorando: http://underscorejs.org/docs/underscore.html#section-112 –

+1

La mia ipotesi è una volta che si valuta questa riga 'arr = []' 'arr''s il tipo è impostato. Dopodiché non c'è la possibilità per la VM di sapere che il tipo è cambiato fino al prossimo incarico. –

+0

@Adi Inbar Il titolo era deciso. Perché hai modificato? Non è questo il modo corretto per specificarlo? – 1252748

risposta

7

Se si guardano le underscore.js source, si vedrà che la funzione è definita come isArray :

_.isArray = nativeIsArray || function(obj) { 
    return toString.call(obj) == '[object Array]'; 
    }; 

del nativo Array.isArray dice che è una matrice, poiché questo è quello che si è creato un'istanza come Brower. Se il browser non ha un codice nativo isArray, underscore.js utilizza la seconda opzione: confronta toString sull'oggetto per vedere se corrisponde alla stringa [object Array].

La semplice aggiunta di una proprietà non è sufficiente per modificare il tipo dell'oggetto (in base alla macchina virtuale JavaScript, è ancora un oggetto che sembra essere un array). JavaScript è un linguaggio dinamico che significa che è possibile aggiungere proprietà agli oggetti integrati, ma ciò non cambia quello che sono; li hai semplicemente estesi. Ad esempio, Prototype.js utilizzato per estendere oggetti nativi aggiungendo loro proprietà extra (come iteratori, filtri, funzioni di mappatura, ecc.).

È possibile vedere il comportamento in Chrome abbastanza facilmente:

> var arr = []; 
    arr.something = "test"; 

> Array.isArray(arr); 
    true 

> toString.call(arr); 
    "[object Array]" 

EDIT

La matrice non perde la sua proprietà length:

> var arr = [1, 2, 3]; 
    arr.something = "test"; 
    console.log(arr.length, arr.something); 

    3 "test" 

Si noti che il browser ha riferito la lunghezza corretta di 3 e il valore corretto per test f o la proprietà something.

+0

+1 Sembra che la mia ipotesi fosse giusta :) –

+0

Ma perde il suo metodo 'length'? Quindi è cambiato su alcuni livelli fondamentali, no? – 1252748

+0

incolla il codice sopra nella tua console. FF dice che ha sia length = 0 e .qualcosa = test – Robert

Problemi correlati