JavaScript中"键"的类型是什么?

tun*_*und 24 javascript object key-value

当我失去焦点并开始怀疑一个愚蠢的问题时,我陷入其中一个时刻:

var a = {
  b: "value"
}
Run Code Online (Sandbox Code Playgroud)

什么是'b'的类型,我不是指"值"的类型,而是标记为b的实际密钥?

背景:当我不得不创建一个字符串键时,我开始想知道这个:

var a = {
  "b": "value"
}
Run Code Online (Sandbox Code Playgroud)

因为稍后它被引用为:

a["b"]
Run Code Online (Sandbox Code Playgroud)

然后加油想知道原来的问题.

And*_*y E 27

在对象字面上,b是一个属性.属性是JavaScript中的字符串或符号,但在对象文字中定义属性名称时,可以省略字符串分隔符.

for (key in a) {
    alert(typeof key);
    //-> "string"
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ens 12

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

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'
Run Code Online (Sandbox Code Playgroud)

出于这个原因,我建议只使用字符串文字作为属性名称.

JavaScript中的Unquoted属性名称/对象键,我对该主题的描述:

如果属性名称是数字文字或有效标识符名称,则只能省略引号.

[...]

括号表示法可以安全地用于所有属性名称.

[...]

只有当属性名称是有效的标识符名称时,才能使用点表示法.

我还创建了一个工具,告诉您是否可以使用任何给定的属性名称而不使用引号和/或带点符号.在mothereff.in/js-properties试试吧.

截图


aul*_*ron 5

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

var a = {
    b: "value"
}
Run Code Online (Sandbox Code Playgroud)

代替

var a = {
  "b": "value"
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*llo 5

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

var a = {
  "1b":       "value",
  "b and c":  "value",
  "+12345":   "value"
};
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以使用点符号或下标符号引用对象的属性,无论声明时是否使用引号。但是,如果您使用的属性名称是无效标识符,例如上面示例中的属性名称,则必须使用下标表示法:

a.1b             // invalid (dot notation)
a["b and c"];    // valid   (subscript notation)
Run Code Online (Sandbox Code Playgroud)