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中进行某种结构化赋值吗?
答案 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
// ^^
}
}
所以考虑到稻草人的存在,我怀疑现在带有稻草人的旧维基离线,proposals repo中的assign
将是我在ES6中能做的最好的事情。:=
没有任何内容。
答案 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[] =
你回答同样的问题,实际上更多,但有些值得思考。