当我失去焦点并开始怀疑一个愚蠢的问题时,我陷入了其中一个时刻:
var a = {
b: "value"
}
'b'的类型是什么,我不是指“值”的类型,而是标记为b的实际键?
背景: 当我必须创建一个字符串键时,我开始想知道这个:
var a = {
"b": "value"
}
因为稍后它被引用为:
a["b"]
然后开始想知道原来的问题。
答案 0 :(得分:25)
在对象字面意义上,b
是一个属性。属性是JavaScript中的字符串或symbols,但在对象文字中定义属性名称时,可以省略字符串分隔符。
for (key in a) {
alert(typeof key);
//-> "string" or "symbol"
}
答案 1 :(得分:10)
属性名称会自动强制转换为字符串。您可以使用数字文字作为属性名称来自行尝试。
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处尝试。
答案 2 :(得分:2)
b是一个字符串,它只是一个简写语法,所以你写
var a = {
b: "value"
}
而不是
var a = {
"b": "value"
}
答案 3 :(得分:2)
请记住,JavaScript对象是哈希表,键只是字符串。您可以在声明期间省略属性名称周围的引号,但如果您对属性名称或恰好是无效标识符的任何其他名称使用保留字,例如以数字开头或包含空格,则必须包装属性引号中的名字:
var a = {
"1b": "value",
"b and c": "value",
"+12345": "value"
};
另请注意,您可以使用点表示法或下标表示法引用对象的属性,无论引用它们时是否使用引号。但是,如果使用属于无效标识符的属性名称(例如上例中的属性名称),则必须使用下标表示法:
a.1b // invalid (dot notation)
a["b and c"]; // valid (subscript notation)
答案 4 :(得分:0)
var a = {$ : 'hello', 2123 : 'number'};
for(var key in a) {
console.log(typeof key)
}

javascript对象中的键可以是字符串和符号。 symbol是javascript中的原始数据类型。