2016-04-25 32 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

相關問題