2016-07-14 69 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