Что такое сокращенное свойство JavaScript?
var obj = { prop = [1,2,3] };
Выше код содержит опечатку, должно быть двоеточие вместо =
. Но меня удивило сообщение об ошибке VM:
var obj = { prop = [1,2,3] };
^^^^^^^^^^^^^^
SyntaxError: Invalid shorthand property initializer
Я искал "сокращенные свойства JavaScript", но этот термин до сих пор не ясен для меня. Что означает "короткое свойство" в контексте этого сообщения об ошибке?
Ответы
Ответ 1
С ES6 вы можете использовать сокращенные имена свойств, которые позволят вам написать что-то вроде этого.
var s = 'abc';
var n = 1;
var o = { s, n }; // This is equivalent to { s: s, n: n }
В вашем случае prop = [1,2,3]
анализировалось как одно сокращенное свойство (s
и n
в примере выше), но оно не было надлежащим именем свойства.
Ответ 2
У Firefox есть другое сообщение об ошибке, которое, на мой взгляд, более полезно:
SyntaxError: missing : after property id
То есть, отсутствует :
Как вы говорите, вы должны использовать :
вместо =
.
Чтобы было ясно, "сокращенное свойство" не имеет смысла в спецификации ES6. Это просто какое-то выражение, изобретенное Chrome, чтобы помочь вам заметить вашу ошибку. Кажется, они потерпели неудачу.
Предполагается, что Chrome относится к PropertyDefinition, состоящему из IdentifierReference, используемого в ObjectLiteral. Очевидно, что prop = [1,2,3]
не является идентификатором, поэтому имеет смысл жаловаться на него. Было бы еще больше смысла жаловаться, что это не PropertyDefinition в гораздо более распространенной форме PropertyName :
AssignmentExpression. Или MethodDefinition.
Ответ 3
Поскольку из MDN нет официальных объяснений, я могу только предположить, что это может означать.
Рассмотрим следующее:
Существует два способа создания массива.
Длинный путь (вид):
var cars = new Array("Saab", "Volvo", "BMW");
Короткий путь:
var cars = ["Saab", "Volvo", "BMW"];
Длинный и короткий путь более очевиден при работе с созданием объектов:
Долгий путь:
var person = new Object();
person.firstName = "John";
person.lastName = "Doe";
Короткий путь:
var person = {firstName: "John", lastName: "Doe"};