是下面有什麼區別:訪問JavaScript對象使用[]符號
var ourDog = {
"name": "Camper"
};
和
var ourDog = {
name: "Camper",
};
,以及它如何能夠在這兩種情況下返回露營爲ourDog["name"]
。
當我們用[]
表示法訪問對象屬性時,場景後面是否發生了任何轉換?
是下面有什麼區別:訪問JavaScript對象使用[]符號
var ourDog = {
"name": "Camper"
};
和
var ourDog = {
name: "Camper",
};
,以及它如何能夠在這兩種情況下返回露營爲ourDog["name"]
。
當我們用[]
表示法訪問對象屬性時,場景後面是否發生了任何轉換?
http://ecma-international.org/ecma-262/6.0/#sec-object-initializer
屬性名稱只能是一個標識符名稱(即標識符+保留字),一個字符串文字或數字文字。
你不能用一個數字文本與點符號,但括號標記的工作原理:
var ourDog = {
123: "Camper",
};
輸出
ourDog[123] // Camper
但
ourDog.123 // SyntaxError
更多信息,看看到this
屬性名稱必須是字符串。這意味着非字符串對象不能用作對象中的鍵。任何非字符串對象,包括一個數,經由toString方法
var object = {};
object['1'] = 'value';
console.log(object[1]);
該輸出「值」類型強制轉換成字符串,由於1類型強制轉換到「1」。
實施例是從MDN
檢查specs
PropertyDefinition:屬性名:AssignmentExpression
- 的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
};
感謝Gurvinder +1!如果你可以用簡單的語言進一步描述,這將是非常有幫助的,發現有點難以理解爲新手。 – blueMoon
簡而言之,如果值是有效的原始值,那麼JS引擎需要一個不帶引號的文字屬性名稱,否則它需要用引號引起來。 – gurvinder372
可以使用括號記號如果對象'keys'是動態 – Arif
如果屬性名稱有一個空間,然後'變種ourDog = { 「名」:「坎珀」 };'那麼就不會工作沒有引號 – gurvinder372
我很清楚它的用法,我的疑問是它如何產生相同的結果對於這兩個對象;我的意思是用引號和沒有引號。 – blueMoon