2016-07-14 70 views
0

是下面有什麼區別:訪問JavaScript對象使用[]符號

var ourDog = { 
    "name": "Camper" 
}; 

var ourDog = { 
    name: "Camper", 
}; 

,以及它如何能夠在這兩種情況下返回露營ourDog["name"]

當我們用[]表示法訪問對象屬性時,場景後面是否發生了任何轉換?

+0

可以使用括號記號如果對象'keys'是動態 – Arif

+0

如果屬性名稱有一個空間,然後'變種ourDog = { 「名」:「坎珀」 };'那麼就不會工作沒有引號 – gurvinder372

+0

我很清楚它的用法,我的疑問是它如何產生相同的結果對於這兩個對象;我的意思是用引號和沒有引號。 – blueMoon

回答

0

http://ecma-international.org/ecma-262/6.0/#sec-object-initializer

屬性名稱只能是一個標識符名稱(即標識符+保留字),一個字符串文字或數字文字。

你不能用一個數字文本與點符號,但括號標記的工作原理:

var ourDog = { 
    123: "Camper", 
}; 

輸出

ourDog[123] // Camper 

ourDog.123 // SyntaxError 

更多信息,看看到this

0

屬性名稱必須是字符串。這意味着非字符串對象不能用作對象中的鍵。任何非字符串對象,包括一個數,經由toString方法

var object = {}; 
object['1'] = 'value'; 
console.log(object[1]); 

該輸出「值」類型強制轉換成字符串,由於1類型強制轉換到「1」。

實施例是從MDN

1

檢查specs

PropertyDefinition:屬性名:AssignmentExpression

  1. 的PropertyName的返回PROPNAME。

這部分規範建議使用它的值的屬性名稱的形式語法。

另外,在此之前this part of the spec建議propertyName可以是literalPropertyName,不需要將其描述爲字符串

的PropertyName [產率]:

LiteralPropertyName

ComputedPropertyName [?產量]

LiteralPropertyName:

IdentifierName

串文字

NumericLiteral

這就是爲什麼你會得到相同的結果,兩個name的d "name"

但是,如果屬性名稱爲first name,那麼您需要使用該字符串,否則您將收到編譯錯誤,因爲在屬性名稱後面有一個冒號:

//correct syntax 
var ourDog = { 
    "first name": "Camper" 
}; 

//incorrect syntax 
var ourDog = { 
    first name: "Camper" //since after first there is no colon so there will be compilation error 
}; 
+0

感謝Gurvinder +1!如果你可以用簡單的語言進一步描述,這將是非常有幫助的,發現有點難以理解爲新手。 – blueMoon

+0

簡而言之,如果值是有效的原始值,那麼JS引擎需要一個不帶引號的文字屬性名稱,否則它需要用引號引起來。 – gurvinder372