2016-04-25 31 views
0

[0]在JavaScript为什么OBJ [-0]不等于OBJ - 在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

我会假设这是因为'-0'和'+ 0'首先被编译,所以实际传递的是'-1 * 0'(它是0)和'+ 1 * 0'(同样为0)的结果。 – Jhecht

+3

你试过'(-0).toString()'和'(+0).toString()'吗? – Bergi

+0

@Bergi哦,谢谢你,我没有注意到这一点。 – codefalling

回答

2

看来obj[number]等于obj[number.toString()]

是的。在ECMAScript 5中,所有属性的属性名称均为字符串 - 并且无论您传递给属性访问运算符(方括号表示法),都会隐式转换为字符串。

但它与-0来自不同的+0

不,这是对那些相同。你似乎对String(-0)String(+0)产量为"0"的事实感到困惑,但事实就是如此。

0

+0是一个整数。当然,+ 0 = 0。我们正在讨论数组索引0(其中obj不是)。

'+0'是一个字符串,它不是一回事。这是对象的属性'+0',与“asd”完全相同。

请注意,在JS中,[ ]适用于数组和对象。 obj['asd']代表obj.asd(但不能写obj.+0,因为它不是有效的属性名称)。

+1

JS中的数组和对象之间没有太大区别。 '...''在他们身上运作*完全一样*。是的,每个数组都是一个对象。 – Bergi

+0

你不能使用'obj。+ 0',因为'+ 0'不是一个IdentifierName。 – Oriol

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']因为x['0'] != x['+0']

+0

hum,'x = {'0':1,'1':2,'2':3}'不会继承数组的原型方法('x.sort' =>'undefined')数组只是对象键。 – Kaiido

相关问题