使用ES6,我可以通过以下函数创建一个新对象:
var obj = {
something() {}
};
这很有道理。但我也可以这样做:
var obj = {
'something'() {}
};
我可以这样做:
var obj = {
['something']() {}
};
这三种语法有什么不同?为什么所有这些语法都是语法上有效的?
使用ES6,我可以通过以下函数创建一个新对象:
var obj = {
something() {}
};
var obj = {
'something'() {}
};
var obj = {
['something']() {}
};
这三种语法有区别吗?
就你的例子而言,结果没有区别。
但是,不同的语法确实具有不同的特点。属性名称的定义方式并不特定于方法定义,规则适用于所有属性名称:
Property names that are valid identifier names or number literals don't need to be quoted:
{
foo: ...,
10e4: ...,
if: ...,
}
Anything else needs to be quoted:
{
'foo+bar': ...,
'abc def': ...,
'123,45': ...,
}
The square bracket syntax is new in ES6 and allows you do dynamically compute property names:
{
[getPropertyName()]: ...,
['item' + (i * 3)]: ...,
}
为什么这些语法都是有效的?
因为语法允许它:
MethodDefinition :
PropertyName ( StrictFormalParameters ) { FunctionBody }
GeneratorMethod
get PropertyName ( ) { FunctionBody }
set PropertyName( PropertySetParameterList ) { FunctionBody }
PropertyName :
LiteralPropertyName
ComputedPropertyName
LiteralPropertyName :
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName :
[ AssignmentExpression ]
如果您将方法视为将函数分配给属性,则对于函数/方法名称应适用与属性名称相同的规则似乎是有意义的。
['foo' + someFunction()]
并具有动态(创建时)属性名称。很巧妙的技巧。 - apscience第一和第二个是相同的,并且执行的操作也是相同的
obj.something = function something() {}
obj['something'] = function() {}
引号允许创建在JS中不是有效标识符(函数名称)的键,例如:
var obj = {
'123'() {}
};
创建一个名为123
的函数,信不信由你。
方括号语法允许使用任意表达式,因此您可以执行以下操作:
var obj = {
['myfunc_' + getFuncName()] () {}
}
以及类似的酷东西。
var obj = { 123() {} };
也是有效的。 - Felix Kling[...]()
不能执行SetFunctionName。标准似乎并不关心PropertyName是Literal还是Computed。 - georgSetFunctionName
来说,PropName
并不重要。它只在静态上下文中使用,以防止类中出现重复的constructor
s、静态prototype
属性等。 - Bergi
['x']
。 - Onur Yıldırım[Math.random()]
。 - apscience