关于JavaScript对象属性名称的问题

时间:2011-02-15 16:01:45

标签: 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标识符,则不需要对象属性名称的引号。

E.g。

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

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

谢谢!

3 个答案:

答案 0 :(得分: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不是上述数字。

答案 1 :(得分:8)

每个键值对的关键部分可以写成任何有效的JavaScript标识符,字符串(用引号括起来)或 数字

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

请参阅规范:http://bclary.com/2004/11/07/#a-11.1.5

答案 2 :(得分:0)

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