2010-08-31 70 views
15

我bumbed进入这些时刻,当我刚刚失去了重心,开始琢磨在一个愚蠢的问题之一:JavaScript中“keys”的类型是什么?

var a = { 
    b: "value" 
} 

什么是typeof运算“B”,我并不意味着将typeof“价值”,但实际的键标记为b?

背景: 我开始思索着,我不得不创建一个关键这是一个字符串:因为它是作为参考稍后

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

a["b"] 

然后不知道原来的问题。

回答

18

在对象字面而言,b是一个属性。属性是JavaScript中的字符串,但在对象文本中定义属性名称时,可以省略字符串分隔符。

当通过使用for...in属性名称循环,属性名是一个字符串:

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

那么现在我开始想知道'钥匙'是一个字符串,只有当你循环的钥匙? - 但我想这取决于JavaScript引擎的实现。 – tunylund 2010-08-31 11:11:27

+0

@tunylund:没有密钥总是一个字符串。我在下面的答案中给出了一些例子:) – 2010-08-31 11:16:34

+1

@tunylund:正如@Daniel所说,密钥总是一个字符串。由于没有真正的用例来测试一个对象的键的类型(不是键的值),并且除了像这样循环枚举键之外没有办法做到这一点,所以这不是你应该担心的事情:) – 2010-08-31 11:23:57

2

b是字符串,它只是一个速记语法,所以你写

var a = { 
    b: "value" 
} 

,而不是

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

记住JavaScript对象是哈希表和钥匙都只是字符串。您可以在声明期间忽略属性名称周围的引号,但是如果您使用保留字来表示属性名称或任何其他恰巧是无效标识符的名称(例如以数字开头或包含空格),则必须包装属性名称引号:

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

另外请注意,您可以参考使用点符号或标符号对象的属性,无论是否在那里他们被宣布时使用引号。但是,如果您使用属性名称,这将是无效的标识符,如在上面的例子中的,你不得不使用下标符号:

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

这些无效标识符是否适用于所有(主要)浏览器?你有没有冒险在一些JavaScript引擎中抛出异常? – 2010-08-31 11:06:17

+1

@Marcel:下标符号由ECMA-262规范定义,任何字符串都是有效的。 – 2010-08-31 11:08:20

+0

@Marcel:是的,他们应该在所有浏览器中工作。对象是散列表,并接受任何字符串作为键(属性名称)。道格拉斯克罗克福德在这里描述了这个话题(部分对象):http://www.crockford.com/javascript/survey.html – 2010-08-31 11:11:23

8

属性名称被自动强制转换为字符串。您可以使用数字文字作为属性名称来尝试。

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' 

因此,我建议只使用字符串文字作为属性名称。

Unquoted property names/object keys in JavaScript,关于这个问题我写了:如果属性名称是数字文字或a valid identifier name

行情只能被省略。

[...]

括号标记可安全地用于所有属性名。

[...]

圆点符号可以被当属性名称是有效的标识符名称使用。

我也做了一个工具,它会告诉你,如果任何给定的属性名称可以使用不带引号和/或点表示法。尝试在mothereff.in/js-properties

Screenshot

0

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

密钥在javascript对象可以是字符串和符号。符号是javascript中的一种原始数据类型。