Warum kann ich einem Array benannte Eigenschaften hinzufügen, als wäre es ein Objekt?

Die folgenden zwei verschiedenen Code-Snippets scheinen mir gleich zu sein:

var myArray = Array(); myArray['A'] = "Athens"; myArray['B'] = "Berlin"; 

und

 var myObject = {'A': 'Athens', 'B':'Berlin'}; 

weil sie sich beide gleich verhalten, und auch typeof(myArray) == typeof(myObjects) (beide ergeben ‘object’).

Gibt es einen Unterschied zwischen diesen Varianten?

   

Praktisch alles in Javascript ist ein Objekt, so dass Sie ein Array- Objekt “missbrauchen” können, indem Sie beliebige Eigenschaften darauf setzen. Dies sollte jedoch als schädlich angesehen werden . Arrays sind für numerisch indizierte Daten – für nicht-numerische Schlüssel verwenden Sie ein Objekt.

Hier ist ein konkreteres Beispiel, warum nicht-numerische Schlüssel nicht zu einem Array passen:

 var myArray = Array(); myArray['A'] = "Athens"; myArray['B'] = "Berlin"; alert(myArray.length); 

Dies wird nicht ‘2’, sondern ‘0’ anzeigen – effektiv wurden dem Array keine Elemente hinzugefügt, nur einige neue Eigenschaften, die dem Array-Objekt hinzugefügt wurden.

In JS-Arrays sind Objekte, nur leicht modifiziert (mit ein paar mehr functionen).

functionen wie:

 concat every filer forEach join indexOf lastIndexOf map pop push reverse shift slice some sort splice toSource toString unshift valueOf 

Alles in JavaScript ist ein Objekt neben primitiven Typen.

Der Code

 var myArray = Array(); 

Erstellt eine Instanz des Array-Objekts während

 var myObject = {'A': 'Athens', 'B':'Berlin'}; 

Erstellt eine Instanz des Object-Objekts.

Probieren Sie den folgenden Code aus

 alert(myArray.constructor) alert(myObject.constructor) 

Sie sehen also den Unterschied in der Art des Objektkonstruktors.

Die Instanz des Array-Objekts enthält alle Eigenschaften und Methoden des Array-Prototyps.

Ich denke, ich bin zu metaphorisch und kryptisch mit vorheriger Antwort. Erläuterung folgt.

Eine Instanz von Array, Boolean, Datum, function, Zahl, RegExp, String ist ein Objekt, das jedoch mit für jeden Typ spezifischen Methoden und Eigenschaften erweitert wurde. Zum Beispiel hat ein Array eine vordefinierte length während generische Objekte dies nicht tun.

 javascript:alert([].length+'\n'+{}.length) 

zeigt an

 0
 nicht definiert

Intrinsisch unterscheidet der FF Gecko-Interpreter auch zwischen Arrays und generischen Objekten mit deutlichen Unterschieden bei der Auswertung von Sprachkonstrukten.

 javascript: ra=[ "one", "two", "three"]; ra.a=4; ob={0:"one", 1:"two", 2:"three"}; ob.a=4; alert( ra +"\n\n"+ ob +"\n\n"+ ra.toSource() +"\n\n"+ ra.a +"\t .toSource() forgot me! \n\n"+ ra.length +"\t and my length! \n\n"+ ob.toSource()); ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */ ps=""; for(i in ob)ps+=i+" "; alert(ps); 

anzeigen

 eins zwei drei

 [Objekt Objekt]

 ["eins zwei drei"]

 4 .toSource () hat mich vergessen! 

 3 und meine Länge! 

 ({0: "eins", 1: "zwei", 2: "drei", a: 4})

und 0 1 2 a und 0 1 2 a .

Bezüglich der Aussage, dass alle Objekte functionen sind:

Es ist weder syntaktisch noch semantisch korrekt, eine beliebige Objektinstanz als function wie 123() oder "abc"() oder []() oder {}() oder obj() wobei obj irgendein anderer Typ als Function ist ein beliebiges Objekt INSTANCE ist keine Function . Bei einem Objekt obj und seinem Typ als Array, Boolean, Date, ... wurde obj als Array, Boolean, Date, ... . Was ist ein Array, Boolean, Date, ... ?

 javascript: alert([Array, Boolean, Date, Function, Number, Object, RegExp, String] . join('\n\n') ); 

zeigt an

 function Array() { [native code] } function Boolean() { [native code] } function Date() { [native code] } function Function() { [native code] } function Number() { [native code] } function Object() { [native code] } function RegExp() { [native code] } function String() { [native code] } 

In jedem Fall, ohne Zweideutigkeit, manifestiert sich der Objekttyp als function , daher die Aussage, dass alle Objekte functionen sind! (Die augenzwinkernde ist, dass ich absichtlich die Unterscheidung einer Objektinstanz mit der ihres Typs verdunkelt und verschwommen habe! Dennoch zeigt dies, “Sie können keine ohne die andere haben”, Objekt und function! Großschreibung betont Typ als im Gegensatz zur Instanz.)

Sowohl ein funktionales als auch ein Objekt-Paradigma scheinen grundlegend für die Programmierung und Implementierung der JS-Interpreter-Primitive auf niedriger Ebene zu sein, wie zum Beispiel Math und JSON und true .

  javascript:alert([Math, JSON, true.toSource()].join("\n\n")); 

zeigt an

 [object Math] [object JSON] (new Boolean(true)) 

Zum Zeitpunkt der Entwicklung von Javascript war ein objektorientierter Programmierstil (OOPs – objektorientierter Programmierstil – das “s” ist mein eigenes Wortspiel!) In Mode und der Interpreter wurde in ähnlicher Weise mit Java getauft, um ihm eine größere Glaubwürdigkeit zu geben . functionale Programmiertechniken wurden auf abstraktere und esoterische Untersuchungen beschränkt, die die Theorien von Automaten, rekursiven functionen, formalen Sprachen usw. untersuchten und daher nicht so schmackhaft waren. Die Stärken dieser formalen Überlegungen zeigen sich jedoch deutlich in Javascript, insbesondere in .toSource() Gecko-Engine (dh .toSource() ).


Die Objektdefinition für function ist besonders befriedigend, da sie als Rekursionsbeziehung definiert ist! definiert mit eigener Definition!

function Function() { [native code] }
und da eine function ein Objekt ist, gilt dasselbe
function Object() { [native code] } .

Die meisten anderen Definitionen gehen in einen statischen Endwert über. eval() ist jedoch ein besonders mächtiges Primitiv, und so kann ein String auch beliebige functionalität einbetten.

Beachten Sie, dass die oben verwendete Umgangssprache den Objekttyp und die Instanzunterscheidung verdeckt.

Ein praktischer Unterschied besteht darin, dass bei der Verwendung von JSON.stringify für ein array alle nicht numerischen Indizes ignoriert werden:

 var arr = []; var obj = {}; arr['name'] = 'John'; obj['name'] = 'John'; console.log(arr); // will output [name: "John"] console.log(obj); // will output {name: "John"} JSON.stringify(arr); // will return [] JSON.stringify(obj); // will return {"name":"John"} 

Der Unterschied zwischen den Arrays und den anderen Objekten in JavaScript. Während Arrays eine magisch aktualisierende Längeneigenschaft haben, gibt es für andere Objekte als die Arrays keine Möglichkeit, eine solche Eigenschaft zu implementieren.

 var arrName = []; arrName[5] = "test"; arrName.length; // < - 6 

Arrays werden verwendet, um Dinge mit einem Ordinalindex zu speichern - verwenden Sie sie wie ein traditionelles Array, einen Stapel oder eine Warteschlange. Ein Objekt ist ein Hash - verwenden Sie es für Daten, die einen eindeutigen Schlüssel haben.

Die {} -Notation ist nur syntaktischer Zucker, um den Code netter zu machen 😉

JavaScript hat viele ähnliche Konstrukte wie die Konstruktion von functionen, wobei function () nur ein Synonym für ist

 var Func = new Function("", "");