JavaScript 简写属性是什么?

24
var obj = { prop = [1,2,3] };

上面的代码存在一个打字错误,应该使用冒号而不是=。但让我惊讶的是VM的错误消息:

var obj = { prop = [1,2,3] };
            ^^^^^^^^^^^^^^
SyntaxError: Invalid shorthand property initializer

我搜索了“JavaScript 简写属性”,但这个术语对我来说仍然不清楚。在这个错误信息的上下文中,“简写属性”是什么意思?


1
“=” 仅用于赋值变量,而不是属性。请将 “=” 替换为 “:”。 - choz
7
很明显,根据第一句话:“上面的代码存在一个拼写错误,应该使用冒号而不是'='。”可以看出该贴主知道这个问题。 - Paul
@Paulpro 要么以前没有,要么我完全错过了它... - choz
1
如果有人搜索“速记属性”,来到这里可能是一件好事,因为缩写属性与对象字面量的关系并不明显。 - exebook
2
@exebook 我同意这个很有用,不是重复的。{Q: "什么是X?",A: "Y"} !== {Q: "什么是Y",A: "X"} - James
@James 这正是那些投票者经常忽略的逻辑。 - exebook
3个回答

35

在ES6中,您可以使用简写属性名称,使您能够编写类似于以下内容的代码。

var s = 'abc';
var n = 1;
var o = { s, n }; // This is equivalent to { s: s, n: n }
在您的情况下,prop = [1,2,3]被解析为一个简写属性(例如上面例子中的sn),但它不是一个正确的属性名。

1
我不认为无效的属性名称与此有任何关系?将“prop”更改为其他任何内容都会产生相同的错误。 - Drazen Bjelovuk
你的意思是这个等同于 { s: 'abc', n: 1 },对吗? - Jwan622
5
@Jwan622,“{ s,n }”在语法上等同于“{ s:s,n:n }”,在此上下文中将被计算为“{ s:'abc',n:1 }”。 - snak

7
火狐浏览器的错误信息和其他浏览器不同,我认为更加有用:
SyntaxError: missing : after property id

也就是说,缺少了一个冒号:。正如你所说,应该使用:而不是=
为了明确起见,“shorthand property”在ES6规范中没有意义。这只是一些表达式Chrome发明的,以帮助您注意到错误。看来他们失败了。 snak's guess认为Chrome指的是由IdentifierReference组成的PropertyDefinition,用于ObjectLiteral中。显然,prop = [1,2,3]不是一个IdentifierReference,因此抱怨它可能是有道理的。更有意义的是抱怨它不是更常见形式的PropertyName:AssignmentExpressionMethodDefinitionPropertyDefinition

3
问题已经明确指出:“上面的代码存在一个错别字,应该使用冒号而不是等于号”。问题是关于为什么错误被描述成那个样子的。 - Evan Trimboli
@EvanTrimboli 是的。你应该看看字里行间。我的回答是试图以礼貌的方式说“停止使用像Chrome这样给出如此无意义和误导性错误消息的愚蠢浏览器”。 - Oriol
3
好的,那仍然没有回答这个问题。 - Evan Trimboli
@EvanTrimboli 这个问题是“在这个错误消息的上下文中,'Shorthand属性'是什么意思?”。答案是“这只是你的浏览器决定显示的一些垃圾随机消息”,其他浏览器使用更好的消息。 - Oriol
2
它们通常被称为简写属性初始化程序:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Object_initializer - Evan Trimboli
显示剩余2条评论

0

由于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"};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接