Ich versuche herauszufinden, was für den Eigenschaftsnamen eines Javascript-Objekts als gültig angesehen wird. Zum Beispiel
var b = {}
b['-^colour'] = "blue"; // Works fine in Firefox, Chrome, Safari
b['colour'] = "green"; // Ditto
alert(b['-^colour']); // Ditto
alert(b.colour); // Ditto
for(prop in b) alert(prop); // Ditto
//alert(b.-^colour); // Fails (expected)
In diesem Beitrag werden gültige Javascript-Variablennamen aufgeführt, und '- ^ color' ist eindeutig nicht gültig (als Variablenname). Gilt das auch für Objekteigenschaftsnamen? Mit Blick auf das Obige versuche ich herauszufinden, ob
b ['- ^ color'] ist ungültig, funktioniert aber in allen Browsern eigenartig, und ich sollte nicht darauf vertrauen, dass es in Zukunft funktioniert
b ['- ^ color'] ist vollständig gültig, aber es handelt sich nur um eine Form, auf die nur auf diese Weise zugegriffen werden kann - (es wird unterstützt, damit Objekte möglicherweise als Karten verwendet werden können?)
Etwas anderes
Abgesehen davon kann eine globale Variable in Javascript auf der obersten Ebene als deklariert werden
var abc = 0;
könnte aber auch erstellt werden (wie ich es verstehe) mit
window['abc'] = 0;
Das Folgende funktioniert in allen oben genannten Browsern
window['@£$%'] = "bling!";
alert(window['@£$%']);
Ist das gültig? Es scheint den Regeln für die Benennung von Variablen zu widersprechen - oder deklariere ich dort keine Variable? Was ist der Unterschied zwischen einem Variablen- und einem Objekteigenschaftsnamen?
quelle
var x=new function X(){};
,var y=new function Y(){};
undobj={x:true};
-obj[y]
wird ausgegebentrue
, da beidex
undy
, wenn sie als Objektschlüssel verwendet werden, beide in dieselbe Zeichenfolge konvertiert werden"[object Object]"
obj[x] === obj[y] === obj["[object Object]"]
x=obj.my-prop
. Es wäre unklar (sowohl für den Leser als auch für den Parser), ob dies eine Eigenschaft namens "my-prop" ist oder ob die Absicht bestand, eine Variable "prop" von "obj.my" zu subtrahieren.x=obj["my-prop"]
macht deutlich, dass der Name eine Zeichenfolge ist.Benennungsregeln für Objekteigenschaften und Benennungsregeln für Variablen sind getrennt. Der Standard "reserviert" nur eine Handvoll Eigenschaftsnamen (wie
prototype
undconstructor
, IIRC), aber abgesehen von diesen geht jede Zeichenfolge.Außer wenn die Ausführungsumgebung (dh der Browser) beschließt, natürlich mehr magische Eigenschaften hinzuzufügen. (Ich höre, dass das Einstellen
__proto__
einige Dinge auf ziemlich seltsame Weise zerstört)quelle
__proto__
auf null setzen, was bricht das außer der Prototypkette (es ist also eine schnellere Suche nach Eigenschaften), wenn Sie es als einfache Hash-Tabelle für Wertepaare benötigen?Jedes Mal, wenn Sie eine globale Variable erstellen, erstellen Sie tatsächlich ein neues Mitglied eines globalen Objekts (
window
in der Browserumgebung,global
in Node.js usw.). Aus diesem Grundewindow.x
ist genau die gleiche wie (global)var x
,this.x
oder einfach nurx
.Das Verständnis von JavaScript- Objekten wie einer Karte ist völlig richtig, da: a) Sie jederzeit dynamisch ein neues Element hinzufügen können; b) Das Element kann einen beliebigen Namen haben - auch Sonderzeichen. c) Sie können versuchen, auf ein nicht vorhandenes Element eines Objekts / einer Karte zuzugreifen, und es ist kein Fehler. d) Sie können ein Element aus einem Objekt entfernen.
Wenn Sie auf Objektelemente mit Standard- Punktnotation (z. B.
a.x
) zugreifen möchten, dürfen Sie keine anderen Sonderzeichen als _ oder $ verwenden. Auch kann der Name nicht von einer Nummer ausgehen. In allen anderen Fällen müssen Sie eckige Klammern und Anführungszeichen verwenden, um auf Objektelemente zuzugreifen.quelle