隨着ES6,我可以創造一個新的對象中包含以下功能:ES6對象方法分配之間的區別:a,'a'和['a']?
var obj = {
something() {}
};
這是有道理的。但我也可以這樣做:
var obj = {
'something'() {}
};
或者,我可以這樣做:
var obj = {
['something']() {}
};
是否有這三個語法之間的區別嗎?爲什麼這些語法都有效?
隨着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