2013-11-22 21 views
2

考慮到:var foo = {"5" : "ten", fighter : "Grohl"};在JavaScript中使用括號表示法時,爲什麼變量名不會轉換爲字符串?

爲什麼會出現這種結果?

foo[5]; 
"ten" 

foo[1 + 4]; 
"ten" 

foo[fighter]; 
ReferenceError: fighter is not defined 

當然,如果我開始與此:var fighter = 'fighter';然後我得到Grohl預期。

我的理解是,當使用括號表示法時,括號內的表達式將被計算並轉換爲字符串。因此,在foo[5]中,toString()在5上被調用,以便將其評估爲字符串,該字符串必須與括號表示法一起使用。所以我的問題是:

爲什麼不一樣的奢侈品提供給fighter?我知道foo ['fighter']有效,但知道不一定理解。我想了解這裏發生了什麼。

編輯:爲什麼我認爲這是事實。如果戰鬥機是一個持有另一個字符串的變量......說'Dave',那麼javascript會如何知道我是指「Dave」的引用,還是我想將戰鬥機轉換爲實際的字符串「fighter」。很明顯,JavaScript無法讀懂我的想法。感謝@DaveNewton和@pointy的照明。

+6

爲什麼*會*是?你將如何區分一個字符串和一個持有字符串的變量?魔法? –

+1

'var foo = {5:「ten」,fighter =「Grohl」};'只是一個語法錯誤。 – kapa

+1

@bažmegakapa謝謝,糾錯。 –

回答

8

因爲這不是語言的基本語義規定。當您將fighter置於括號中時,您會說「請評估此子表達式並將其值用作對象屬性名稱」。子表達式fighter是對符號的引用,而不是字符串常量。

如果你想使用的標識符的名稱作爲文字屬性名稱,使用.操作:

foo.fighter 

在你的其他例子,同樣的事情是怎麼回事。子表達式51+4的評估方式與他們在別處評估的方式完全相同。也就是說,考慮:

var x = 1 + 4; 

你有什麼期待的 「X」 會是什麼?好了,那麼:

var x = fighter; 

顯然期望,「X」將是「戰鬥機」將是嚴重的怪異;如果語言做到了,你會如何引用一個變量?

相關問題