为什么obj = {x,y}适用于Chrome?

exe*_*ook 8 javascript ecmascript-6

var obj = { type: 'data', x, y, data: []}
Run Code Online (Sandbox Code Playgroud)

显然这是我的错字,{x,y}应该是{x:x,y:y}.但它确实符合我的要求,在Chrome中,字段x获取局部变量的值x.

但为什么它有效呢?

the*_*eye 11

它是ECMAScript 2015(或ECMAScript 6)的一部分.只需指定标识符,就可以在对象文字中的对象中创建新属性.

引用MDN的对象初始化程序的属性定义部分,

使用ECMAScript 6,可以使用更短的符号来实现相同的目标:

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6)
var o = { a, b, c };
Run Code Online (Sandbox Code Playgroud)

ECMAScript 6规范中的相应部分在这里,

AssignmentProperty:IdentifierReference Initializer opt

  1. PIdentifierReference的 StringValue .
  2. lref为ResolveBinding(P).
  3. ReturnIfAbrupt(P).
  4. v为GetV(,P).
  5. ReturnIfAbrupt(v).
  6. 如果初始化器选择存在,并且v不确定的,那么
    1. defaultValue成为评估Initializer的结果.
    2. v为GetValue(defaultValue).
    3. ReturnIfAbrupt(v).
    4. 如果IsAnonymousFunctionDefinition(Initializer)为true,那么
      1. hasNameProperty为HasOwnProperty(v,"name").
      2. ReturnIfAbrupt(hasNameProperty).
      3. 如果hasNamePropertyfalse,则执行SetFunctionName(v,P).
  7. 返回PutValue(lref,v).

基本上,规范说,如果您只使用标识符,将创建一个具有标识符名称的新属性,该值将是该标识符的实际值.它甚至可以是函数的名称.

var a = "foo", b = 42, c = {}, d = function () {};    
console.log({a, b, c, d});
// { a: 'foo', b: 42, c: {}, d: [Function] }
Run Code Online (Sandbox Code Playgroud)


Nat*_*ith 5

ES2015增强了对象文字符号.Chrome 43ish支持此功能(部分支持).

巴别塔有一个很好的解释.