使用ES6,我可以使用以下函数创建一个新对象:
var obj = {
something() {}
};
这是有道理的。但我也可以这样做:
var obj = {
'something'() {}
};
或者我可以这样做:
var obj = {
['something']() {}
};
这三种语法之间有区别吗?为什么所有这些语法都有效?
答案 0 :(得分:6)
这三种语法之间有区别吗?
不适用于您的示例中的结果。
但是,不同的语法确实具有不同的特征。定义属性名称的方式并不特定于方法定义btw,规则适用于所有属性名称:
有效的标识符名称或数字文字的属性名称不需要引用:
{
foo: ...,
10e4: ...,
if: ...,
}
还需要引用任何其他内容:
{
'foo+bar': ...,
'abc def': ...,
'123,45': ...,
}
方括号语法是ES6中的新增功能,允许您动态计算属性名称:
{
[getPropertyName()]: ...,
['item' + (i * 3)]: ...,
}
为什么所有这些语法都有效?
因为grammar允许它:
MethodDefinition :
PropertyName ( StrictFormalParameters ) { FunctionBody }
GeneratorMethod
get PropertyName ( ) { FunctionBody }
set PropertyName( PropertySetParameterList ) { FunctionBody }
PropertyName :
LiteralPropertyName
ComputedPropertyName
LiteralPropertyName :
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName :
[ AssignmentExpression ]
(不确定你在这里会得到什么样的答案)
如果您认为方法等同于为属性分配函数,那么将属性名称的相同规则应用于函数/方法名称似乎是有意义的。
答案 1 :(得分:2)
第一个和第二个相同,并且与
相同obj.something = function something() {}
第三个创建一个匿名函数并将其存储在obj.something中。这相当于:
obj['something'] = function() {}
引号允许创建在JS中不是有效标识符的键(以及函数名),例如:
var obj = {
'123'() {}
};
创建一个名为123
的函数,信不信由你。
方括号语法允许任意表达式,因此您可以执行
var obj = {
['myfunc_' + getFuncName()] () {}
}
和类似的酷事。