在JavaScript中
var obj = {
'34': 'I am 34',
'-777': 'I am -777',
'0': 'I am 0'
}
obj[34] // 'I am 34'
obj[-777] // 'I am -777'
obj[0] // 'I am 0'
似乎obj[number]
等于obj[number.toString()]
。但它与-0
和+0
:
var obj = {
'-0': '-0 here',
'+0': '+0 here'
}
obj[+0]; // undefined
obj['+0']; // '-0 here'
obj['0'] = 'just 0';
obj[+0]; // 'just 0'
obj[-0]; // 'just 0'
为什么?
答案 0 :(得分:2)
似乎
obj[number]
等于obj[number.toString()]
。
是。在ECMAScript 5中,所有属性都具有字符串的属性名称 - 无论您传入属性访问运算符(括号表示法),都隐式地转换为字符串。
但
会有所不同-0
和+0
不,对那些人来说也是如此。您似乎对String(-0)
和String(+0)
产生"0"
这一事实感到困惑,但事实就是如此。
答案 1 :(得分:0)
+0
是一个整数。当然,+ 0 = 0。我们讨论的是数组的索引0
(obj
不是)。
'+0'
是一个字符串,它不是一回事。它是对象的属性'+0'
,与'asd'完全相同。
请注意,在JS中,[ ]
适用于数组和对象。 obj['asd']
代表obj.asd
(但您不能写obj.+0
,因为它不是有效的属性名称。)
答案 2 :(得分:0)
首先要知道的是,Javascript处理对象和数组非常相似。如果要初始化数组x = [1,2,3]
,则可以将其视为与对象x = {'0': 1, '1': 2, '2': 3}
非常相似,因此您可以将其作为索引进行索引。 x[0] === x['0']
。
因此,当您执行x[0]
时,您可以将密钥视为首先转换为字符串。您可以在控制台中尝试这些
(-0).toString() // == "0"
(0).toString() // == "0"
(+0).toString() // == "0"
这里的括号很重要,因为操作顺序很重要。首先评估括号中的内容,然后将其用作键。这就是为什么你可以在像x[1+1] === x[2]
这样的索引中进行数学运算的原因。因此,x[+0]
可以被视为x[(+0).toString()] -> x[(0).toString()] -> x['0']
。
最后,很容易看出为什么数值0 === +0 === -0
但字符串值'0' != '+0' != '-0'
,因此键是不同的,因此x[0] === x[+0]
但是x[+0] != x['+0']
因为{{ 1}}