ES6结构分配?

时间:2015-06-17 17:04:29

标签: javascript variable-assignment ecmascript-6 destructuring

ES6的新解构分配功能现在已经众所周知({3}}在Babel的REPL上;在已经存在的变量的情况下:

let a, b;                 // Existing variables
let o = {a: "a", b: "b"}; // An object to get values from
// ...
({a, b} = o);             // Set them to the props from `o`
console.log(a);           // "a"
console.log(b);           // "b"

ES6中是否有简单相反?根据具有相同名称的变量在现有对象上设置属性? (除了显而易见的o.a = a; o.b = b;

注意我不是在谈论创建对象时,我们可以使用精彩的新对象初始化器语法来做到这一点,这样我们就不会不必要地重复这些名称:

let a = "a";
let b = "b";
let o = {a, b};

但是如果我已经有一个对象,我可以在ES6中进行某种结构化赋值吗?

2 个答案:

答案 0 :(得分:10)

我最接近的是使用Object.assign和临时对象(live copy):

let a = "a", b = "b";             // The variables
let obj = {c: "c"};               // The existing object
Object.assign(obj, {a, b});       // "Structuring" assignment, sort of
console.log(JSON.stringify(obj)); // "{"c":"c","a":"a","b":"b"}

它相当简单,但它是一个函数调用和一个临时对象。

更新: Bergi指出in a comment (链接现已死亡) := there's a strawman proposal将执行此操作的运算符,并且它们的第一个用例之一确实是主要引导我这个问题的用例:构造函数:

// From strawman proposal linked above, doesn't actually exist yet!
class Point {
   constructor(x,y) {
      this := {x,y}  //define and initialize x and y properties of new object
      //   ^^
   }
}

所以考虑到稻草人的存在,我怀疑现在assign将是我在ES6中能做的最好的事情。带有稻草人的旧维基离线,proposals repo中的:=没有任何内容。

答案 1 :(得分:1)

一些实验性的东西,建立在你的答案之上。

如果你想变得有点厚颜无耻,你可以用一个setter来模仿它的赋值部分。绝对不实用,但它是一种有趣的方式来查看在外部可能的行为,如果你可以清空分配def fn_that_uses_a_list(list): if (list[-1] < 0): print id(list) list += [0] # list = list + [0] print id(list) for item in list: print(item) l = [-4, -2] fn_that_uses_a_list(l) 。 (Babel

o[] =

你回答同样的问题,实际上更多,但有些值得思考。