ES6对象方法分配的区别:a,' a'和[' a']?

时间:2016-03-03 23:45:27

标签: javascript ecmascript-6

使用ES6,我可以使用以下函数创建一个新对象:

var obj = {
    something() {}
};

这是有道理的。但我也可以这样做:

var obj = {
    'something'() {}
};

或者我可以这样做:

var obj = {
    ['something']() {}
};

这三种语法之间有区别吗?为什么所有这些语法都有效?

2 个答案:

答案 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()] () {}
 }

和类似的酷事。