为什么obj [-0]不等于JavaScript中的obj [' - 0']

时间:2016-04-25 01:19:30

标签: javascript

在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'

为什么?

3 个答案:

答案 0 :(得分:2)

  

似乎obj[number]等于obj[number.toString()]

是。在ECMAScript 5中,所有属性都具有字符串的属性名称 - 无论您传入属性访问运算符(括号表示法),都隐式地转换为字符串。

  

-0+0

会有所不同

不,对那些人来说也是如此。您似乎对String(-0)String(+0)产生"0"这一事实感到困惑,但事实就是如此。

答案 1 :(得分:0)

+0是一个整数。当然,+ 0 = 0。我们讨论的是数组的索引0obj不是)。

'+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}}