2011-02-15 46 views
10

我有一个关于JavaScript对象属性名称的问题。看看下面的代码:关于JavaScript对象属性名称的问题

<!DOCTYPE html> 
<meta charset="UTF-8"> 
<title>An HTML5 document</title> 
<script> 
    var obj = { 
     123: 'go' // 123 is not a valid JavaScript name. No error here. 
    }; 
    var obj2 = { 
     123a: 'go' // An Error occurred. 
    }; 
</script> 

如果一个JavaScript对象的属性名是一个有效的JavaScript标识,对象porperty名的报价是没有必要的。

E.g.

({go_go: 'go'}); // OK 
({go-go: 'go'}); // Fail 

在上面的代码,123a是无效的JavaScript的名称,它不是被引用。所以发生了一个错误。但123也是一个无效的JavaScript名称,也没有引用,为什么这里没有错误?我个人认为123必须引用。

谢谢!

+0

thats javascript for ya。我想你会因为没有得到一个错误而得到一个错误;在var语句的末尾 – Matt 2011-02-15 16:08:55

+0

@Matt:不,JavaScript有一些非常复杂的自动分号插入;只有,请不要依赖它,当你在关键地方省略分号时,事情可能会变得非常糟糕。 – 2011-02-15 20:50:02

+1

@Marcel谢谢。我添加了`;`。 – weilou 2011-02-16 08:49:04

回答

19

看一看的specification

 
ObjectLiteral : 
    { } 
    { PropertyNameAndValueList } 
    { PropertyNameAndValueList ,} 

PropertyNameAndValueList : 
    PropertyAssignment 
    PropertyNameAndValueList , PropertyAssignment 

PropertyAssignment : 
    PropertyName : AssignmentExpression 
    get PropertyName (){ FunctionBody } 
    set PropertyName (PropertySetParameterList){ FunctionBody } 

PropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

所以属性名称可以是一个标识符名称,一个字符串或数字。 123是一个数字,而123a既不是上述那些。

8

每个键 - 值对的键部分可被写为任何有效的JavaScript标识符,一个字符串(包裹在引号)或若干

var x = { 
    validIdentifier: 123, 
    'some string': 456, 
    99999: 789 
}; 

见规格:http://bclary.com/2004/11/07/#a-11.1.5

0

123本身不是一个无效的属性名称。任何不是字符串的属性名称都使用toString方法进行类型转换。