Что такое сокращенное свойство 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"};