2010-08-31 7 views
15

ich bumbed in einer jener Momente, in denen ich den Fokus nur verlieren und beginnen auf eine dumme Frage fragen:Was ist die Art von "Schlüsseln" in JavaScript?

var a = { 
    b: "value" 
} 

Was die typeof ‚b‘ ist und ich meine nicht den typeof „Wert“, aber der eigentliche Schlüssel als b bezeichnet?

Hintergrund: Ich begann darüber wundern, wenn ich einen Schlüssel zu erstellen hatte, die eine Zeichenfolge ist:

var a = { 
    "b": "value" 
} 

weil zu einem späteren Zeitpunkt als Bezug genommen wird:

a["b"] 

Und dann überlegte die ursprüngliche Frage.

Antwort

18

In Objektliteral Hinsicht ist b eine Eigenschaft. Eigenschaften sind Zeichenfolgen in JavaScript. Wenn Sie jedoch den Eigenschaftsnamen in einem Objektliteral definieren, können Sie die Zeichenfolgenbegrenzer auslassen.

Wenn Eigenschaftsnamen Schleife durch eine for...in verwendet wird, ist der Name der Eigenschaft ein String:

for (key in a) { 
    alert(typeof key); 
    //-> "string" 
} 
+0

Nun, jetzt habe ich mich gefragt, ob 'key' nur eine Zeichenfolge ist, wenn Sie die Schlüssel in einem? - Aber ich denke, das hängt von der Implementierung der Javascript Engine ab. – tunylund

+0

@tunylund: Kein Schlüssel ist immer ein String. Ich gab einige Beispiele in meiner Antwort unten :) –

+1

@tunylund: Wie @Daniel sagte, der Schlüssel ist immer eine Zeichenfolge. Da es keinen wirklichen Anwendungsfall gibt, um den Typ eines Objektschlüssels (nicht den Wert des Schlüssels) zu testen, und es gibt keine Möglichkeit, dies außerhalb der Aufzählung der Schlüssel mit einer Schleife wie dieser zu tun, sollte man sich keine Sorgen machen :) –

2

b ein String ist, es ist nur eine abgekürzte Syntax, so dass Sie schreiben

var a = { 
    b: "value" 
} 

statt

var a = { 
    "b": "value" 
} 
2

Beachten Sie, dass JavaScript-Objekte sind Hash-Tabellen und die Tasten sind nur Strings. Sie können die Anführungszeichen um Eigenschaftsnamen während der Deklaration weglassen, aber wenn Sie reservierte Wörter für Eigenschaftsnamen oder einen anderen Namen verwenden, der zufällig ein ungültiger Bezeichner ist, z. B. mit einer Ziffer beginnt oder Leerzeichen enthält, müssen Sie die Eigenschaft umbrechen Namen in Anführungszeichen:

var a = { 
    "1b":  "value", 
    "b and c": "value", 
    "+12345": "value" 
}; 

beachten Sie auch, dass Sie die Eigenschaften von Objekten mit Hilfe der Punktnotation oder die Index-Notation unabhängig davon, ob Anführungszeichen verweisen können, wo verwendet, wenn sie deklariert wurden. wenn Sie Eigenschaftsnamen verwenden jedoch die ungültigen Bezeichner sein würde, wie die, die in dem obigen Beispiel werden Sie die Index-Notation verwenden gezwungen:

a.1b    // invalid (dot notation) 
a["b and c"]; // valid (subscript notation) 
+0

Funktionieren diese ungültigen Bezeichner in allen (großen) Browsern? Besteht nicht die Gefahr, in einigen JavaScript-Engines eine Ausnahme auszulösen? –

+1

@Marcel: Indexnotation ist durch die ECMA-262-Spezifikation definiert und jeder String ist gültig. –

+0

@Marcel: Ja, sie sollten in allen Browsern funktionieren. Objekte sind Hashtabellen und akzeptieren eine beliebige Zeichenfolge als Schlüssel (Eigenschaftsname). Douglas Crockford beschreibt das Thema hier (Abschnitt Objekte): http://www.crockford.com/javascript/survey.html –

8

Eigenschaftsnamen werden automatisch in einen String dazu gezwungen. Sie können dies selbst ausprobieren, indem Sie ein numerisches Literal als Eigenschaftsnamen verwenden.

var object = { 
    .12e3: 'wut' 
}; 
object[.12e3]; // 'wut' 
object['.12e3']; // undefined 
object['120']; // 'wut' 

// Let’s try another numeric literal: 
object = { 
    12e34: 'heh' 
}; 
object[12e34]; // 'heh' 
object['12e34']; // undefined 
object[1.2e35]; // 'heh' 
object['1.2e35']; // undefined 
object[1.2e+35]; // 'heh' 
object['1.2e+35']; // 'heh' 

Aus diesem Grund würde ich nur String-Literale für Eigenschaftsnamen empfehlen.

Von Unquoted property names/object keys in JavaScript, meine Zuschreibung auf das Thema:

Zitate kann nur verzichtet werden, wenn der Name der Eigenschaft ein numerisches Literal oder a valid identifier name ist.

[...]

Bracket Notation kann sicher für alle Eigenschaftsnamen verwendet werden.

[...]

Dot-Notation kann nur verwendet werden, wenn der Eigenschaftsname ein gültiger Bezeichner Name ist.

Ich habe auch ein Tool erstellt, das Ihnen sagen wird, ob ein bestimmter Eigenschaftenname ohne Anführungszeichen und/oder Punktnotation verwendet werden kann. Versuchen Sie es bei mothereff.in/js-properties.

Screenshot

0

var a = {$ : 'hello', 2123 : 'number'}; 
 
for(var key in a) { 
 
    console.log(typeof key) 
 
}

Keys in JavaScript-Objekte Strings und Symbole sein. Symbol ist ein primitiver Datentyp in Javascript.

Verwandte Themen