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
.
fonte
2013-07-24 22:02:46
Ecco il codice con cui si sta lavorando: http://underscorejs.org/docs/underscore.html#section-112 –
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. –
@Adi Inbar Il titolo era deciso. Perché hai modificato? Non è questo il modo corretto per specificarlo? – 1252748