2013-07-24 1 views
7

Fügt das Hinzufügen einer Eigenschaft zu einem Array mit Punktnotation ein Objekt hinzu?Ändern eines Arrays in ein Objekt (in Großbuchstaben) durch Hinzufügen eines Werts mithilfe eines Punkts

var arr = []; 

arr.something = "test"; 

ist es ein Array?

Ich glaube nicht, aber Underscore.js sagt, es ist

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

http://jsfiddle.net/wZcyG/

+1

Hier ist der Code, mit dem Sie arbeiten: http://underscorejs.org/docs/underscore.html#section-112 –

+1

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. –

+0

@Adi Inbar Dieser Titel war absichtlich. Warum hast du es bearbeitet? Ist das nicht die richtige Art, es zu spezifizieren? – 1252748

Antwort

7

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.

+0

+1 Sieht aus wie meine Vermutung war richtig :) –

+0

Aber es verliert seine 'Länge' Methode? Es ändert sich also auf einer fundamentalen Ebene, nicht? – 1252748

+0

Fügen Sie den obigen Code in Ihre Konsole ein. FF sagt, es hat beide Länge = 0 und .etwas = Test – Robert