Wenn man sich die Underscore.js aussehen source, werden Sie sehen, dass die isArray
Funktion definiert ist als :
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
Die brower nativen Array.isArray
sagt es ein Array ist, weil das ist, was es als instanziiert wurde. Wenn der Browser kein natives isArray
hat, dann verwendet die Unterstreichung.js die zweite Option: Vergleichen toString
für das Objekt, um zu sehen, ob es mit der Zeichenfolge [object Array]
übereinstimmt.
Das einfache Hinzufügen einer Eigenschaft reicht nicht aus, um den Typ des Objekts zu ändern (laut der virtuellen JavaScript-Maschine ist es immer noch ein Objekt, das zufällig ein Array ist). JavaScript ist eine dynamische Sprache, die bedeutet, dass Sie integrierten Objekten Eigenschaften hinzufügen können. Dadurch wird jedoch nicht geändert, was sie sind. du hast sie nur erweitert. Beispiel: Prototype.js wird verwendet, um native Objekte zu erweitern, indem zusätzliche Eigenschaften hinzugefügt werden (wie Iteratoren, Filter, Zuordnungsfunktionen usw.).
Sie das Verhalten in Chrome sehen ziemlich leicht:
> var arr = [];
arr.something = "test";
> Array.isArray(arr);
true
> toString.call(arr);
"[object Array]"
EDIT
Das Array nicht seine length
Eigenschaft verliert:
> var arr = [1, 2, 3];
arr.something = "test";
console.log(arr.length, arr.something);
3 "test"
Beachten Sie, dass der Browser gemeldet die korrekte Länge von 3
und den korrekten Wert für test
f oder die something
Eigenschaft.
Hier ist der Code, mit dem Sie arbeiten: http://underscorejs.org/docs/underscore.html#section-112 –
Meine Vermutung ist, wenn Sie diese Zeile 'arr = []' 'arr''s bewerten Typ ist festgelegt. Danach hat die VM keine Möglichkeit zu erkennen, dass sich der Typ bis zur nächsten Zuweisung geändert hat. –
@Adi Inbar Dieser Titel war absichtlich. Warum hast du es bearbeitet? Ist das nicht die richtige Art, es zu spezifizieren? – 1252748