Вопрос о названии объекта 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, котировки имен объектов не нужны.

например.

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

В вышеприведенных кодах 123a является недопустимым именем JavaScript и не цитируется. Таким образом, произошла ошибка. Но 123 также является недопустимым именем JavaScript, а также не цитируется, почему здесь нет ошибки? Лично я думаю, что 123 должен быть указан.

Спасибо!

Ответ 1

Посмотрите на спецификацию:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList  ,}

PropertyNameAndValueList :
    PropertyAssignment
    PropertyNameAndValueList , PropertyAssignment

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

PropertyName :  
    IdentifierName
    StringLiteral
    NumericLiteral

Таким образом, имя свойства может быть либо именем идентификатора, либо строкой, либо числом. 123 - это число, тогда как 123a не является ни тем, ни другим.

Ответ 2

Ключевая часть каждой пары ключ-значение может быть записана как любой действительный идентификатор JavaScript, строка (завернутая в кавычки) или число:

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

См. спецификацию: http://bclary.com/2004/11/07/#a-11.1.5

Ответ 3

123 не является, по сути, недопустимым именем свойства. Любое имя свойства, которое не является строкой, является typecast для строки с помощью метода toString.