ES6对象方法分配之间的区别:a,'a'和['a']?
随着ES6,我可以创造一个新的对象中包含以下功能:ES6对象方法分配之间的区别:a,'a'和['a']?
var obj = {
something() {}
};
这是有道理的。但我也可以这样做:
var obj = {
'something'() {}
};
或者,我可以这样做:
var obj = {
['something']() {}
};
是否有这三个语法之间的区别吗?为什么这些语法都有效?
这三种语法有区别吗?
不适用于您的示例中的结果。
但是,不同的语法确实具有不同的特征。属性名称定义的方法是不特定于BTW方法定义的规则适用于所有属性名称:
-
的属性名是有效的标识符名称或数字文字不需要被引用:
{ foo: ..., 10e4: ..., if: ..., }
-
还有什么需要被表示:
{ 'foo+bar': ..., 'abc def': ..., '123,45': ..., }
-
的平方uare支架语法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 ]
(不知道你期待什么样的回答在这里)
如果考虑方法等同于对财产分配功能,似乎有道理将相同的规则应用于属性名称到函数/方法名称。
第一和第二是相同的,并执行相同
obj.something = function something() {}
第三个创造了obj.something匿名函数,并将其存储。这是一个等价于:
obj['something'] = function() {}
行情允许创建密钥(因此函数名)不在JS有效的标识符,例如:
var obj = {
'123'() {}
};
名为123
创建了一个函数,信不信由你。
的方括号语法允许任意表达式,所以你可以做
var obj = {
['myfunc_' + getFuncName()]() {}
}
和类似很酷的事情。
*“......并且做同样的...”*除了'something'没有被绑定在函数内部。 –
@zerkms:是:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-method-definitions-runtime-semantics-propertydefinitionevaluation(步骤3) –
FWIW,'VAR OBJ = {123(){}};'也是有效的。 –
哇。我不知道你可以在文字中使用'['x']。 –
真的很好奇,如果使用最后一个会有什么好处。 – Chris
@Chris:是的:你可以做'[Math.random()]' – apscience