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?
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.
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
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ürfunction 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.
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.
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"}
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.