31

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

var a = {
  b: "value"
}

typeof 'b' 是什么,我不是指 typeof “value”,而是标记为 b 的实际 Key?

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

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

因为稍后它被称为:

a["b"]

然后结束了对原始问题的疑惑。

4

5 回答 5

33

在对象字面上,b是一个属性。在 JavaScript 中,属性要么是字符串,要么是符号,尽管在对象字面量中定义属性名称时,您可以省略字符串分隔符。

for (key in a) {
    alert(typeof key);
    //-> "string"
}
于 2010-08-31T10:53:01.833 回答
23

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

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'

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

来自JavaScript 中未引用的属性名称/对象键,我对此主题的撰写:

仅当属性名称是数字文字或有效的标识符名称时,才能省略引号。

[…]

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

[…]

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

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

截屏

于 2012-03-05T17:56:17.143 回答
4

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

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

另请注意,无论在声明对象时是否使用引号,都可以使用点表示法或下标表示法来引用对象的属性。但是,如果您使用可能是无效标识符的属性名称,例如上面示例中的那些,您将被迫使用下标表示法:

a.1b             // invalid (dot notation)
a["b and c"];    // valid   (subscript notation)
于 2010-08-31T10:57:53.497 回答
3

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

var a = {
    b: "value"
}

代替

var a = {
  "b": "value"
}
于 2010-08-31T10:51:49.927 回答
-1

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

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

于 2017-02-19T19:27:22.050 回答