wake-up-neo.com

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

Die folgenden zwei verschiedenen Codeausschnitte scheinen mir äquivalent zu sein:

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

und

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

denn beide verhalten sich gleich und typeof(myArray) == typeof(myObjects) (beide ergeben 'object').

Gibt es einen Unterschied zwischen diesen Varianten?

101
prinzdezibel

Praktisch alles in Javascript ist ein Objekt, so dass Sie ein Array -Objekt "missbrauchen" können, indem Sie beliebige Eigenschaften für dieses Objekt festlegen. Dieses sollte als schädlich angesehen werden . Arrays sind für numerisch indizierte Daten. Verwenden Sie für nicht numerische Schlüssel ein Object.

Hier ein konkreteres Beispiel, warum nicht numerische Tasten nicht in ein Array "passen":

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

alert(myArray.length);

Dies zeigt nicht '2' an, sondern '0' - effektiv wurden dem Array keine Elemente hinzugefügt, sondern nur einige neue Eigenschaften, die dem Array-Objekt hinzugefügt wurden.

125
Paul Dixon

In JS-Arrays handelt es sich um Objekte, die nur geringfügig modifiziert wurden (mit einigen weiteren Funktionen).

Funktionen wie:

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

Ich denke, ich zu metaphorisch und kryptisch mit der vorherigen Antwort. Klarstellung folgt.

Eine Instanz von Array, Boolean, Date, Function, Number, RegExp, String ist ein Objekt, das jedoch mit für jeden Typ spezifischen Methoden und Eigenschaften erweitert wurde. Ein Array verfügt beispielsweise über eine vordefinierte Eigenschaft length, generische Objekte dagegen nicht.

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

zeigt

 0 
 Undefiniert 

Der FF-Gecko-Interpreter unterscheidet auch zwischen Arrays und generischen Objekten mit deutlichen Unterschieden bei der Bewertung 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] 
 
 ["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 Funktionen sind:

Es ist weder syntaktisch noch semantisch korrekt, eine beliebige Objektinstanz als Funktion wie 123() oder "abc"() oder []() oder {}() oder obj() wobei obj ein anderer Typ als Function ist, daher ist ein beliebiges Objekt INSTANCE kein Function. Wie kam es jedoch dazu, dass ein Objekt obj und sein Typ Array, Boolean, Date, ... War, dass obj ein Array, Boolean, Date, ... War? Was ist ein Array, Boolean, Date, ...?

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

zeigt

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 manifestiert sich der Objekttyp unzweideutig als function -Definition, daher die Aussage, dass alle Objekte Funktionen sind! (Die Laune ist, dass ich absichtlich die Unterscheidung einer Objektinstanz mit der ihres Typs verdeckt und verwischt habe! Dies zeigt jedoch, dass "Sie keine ohne die andere haben können", "Objekt und Funktion"! Die Großschreibung betont den Typ als gegen Instanz.)

Sowohl ein Funktions- als auch ein Objektparadigma scheinen von grundlegender Bedeutung für die Programmierung und Implementierung der integrierten Grundelemente des JS-Interpreters auf niedriger Ebene zu sein, wie z. B. Math und JSON und true.

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

zeigt

[object Math]

[object JSON]

(new Boolean(true))

Zur Zeit der Entwicklung von Javascript war ein objektorientierter Programmierstil (OOPs - Object Oriented Programming Style - das "'s" ist mein eigenes Wortspiel!) Im Trend und der Interpreter wurde auf ähnliche Weise mit Javagetauft. _ um es glaubwürdiger zu machen. Funktionale Programmiertechniken wurden zu abstrakteren und esoterischeren Untersuchungen herangezogen, die die Theorien von Automaten, rekursiven Funktionen, formalen Sprachen usw. studierten und als solche nicht als schmackhaft angesehen wurden. Die Stärken dieser formalen Überlegungen zeigen sich jedoch deutlich in Javascript, insbesondere in der Gecko-Engine von FF (dh .toSource()).


Die Objektdefinition für Funktion ist besonders zufriedenstellend, da sie als Wiederholungsrelation definiert ist! definiert mit seiner eigenen Definition!

function Function() { [native code] }
und da eine Funktion ein Objekt ist, gilt dasselbe Gefühl für
function Object() { [native code] }.

Die meisten anderen Definitionen basieren auf einem statischen Endwert. eval() ist jedoch ein besonders leistungsfähiges Grundelement, sodass ein String auch beliebige Funktionen einbetten kann.

Beachten Sie erneut, dass die oben verwendete Umgangssprache die Unterscheidung zwischen Objekttyp und Instanz verdeckt.

6
Ekim

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 von Object object.

Versuchen Sie den folgenden Code

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

Sie werden sehen, dass der Unterschied in der Art des Objektkonstruktors liegt.

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

5
Dasha Salo

Ein praktischer Unterschied besteht in der Verwendung von JSON.stringify für eine array alle nicht numerischen Indizes werden ignoriert:

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"}
1
user5513314

Der Unterschied zwischen den Arrays und den anderen Objekten in JavaScript. Arrays haben zwar eine magisch aktualisierende length-Eigenschaft, aber für andere Objekte als die Arrays gibt es keine Möglichkeit, eine solche Eigenschaft zu implementieren.

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

Arrays werden zum Speichern von Dingen mit einem Ordinalindex verwendet - verwenden Sie sie wie ein herkömmliches Array, einen Stapel oder eine Warteschlange. Ein Objekt ist ein Hash - verwenden Sie es für Daten, die einen eindeutigen Schlüssel haben.

0
Parth Raval