对象传播与对象分配跨页语法Object.assign()
假设我有一个变量,我想设置一些默认值。options
这两种选择的优点/缺点是什么?
使用对象跨页
options = {...optionsDefault, ...options};
或使用 Object.assign
options = Object.assign({}, optionsDefault, options);
这是让我感到疑惑的承诺。
假设我有一个变量,我想设置一些默认值。options
这两种选择的优点/缺点是什么?
使用对象跨页
options = {...optionsDefault, ...options};
或使用 Object.assign
options = Object.assign({}, optionsDefault, options);
这是让我感到疑惑的承诺。
这不一定是详尽无遗的。
options = {...optionsDefault, ...options};
如果编写代码以便在没有本机支持的环境中执行,则可以只编译此语法(而不是使用 polyfill)。(例如,使用巴别塔。
不那么冗长。
最初写这个答案时,这是一个建议,而不是标准化的。在使用提案时,请考虑一下如果您现在使用它编写代码,并且随着它走向标准化,它不会被标准化或更改,您会怎么做。此后,这已在ES2018中标准化。
字面的,而不是动态的。
Object.assign()
options = Object.assign({}, optionsDefault, options);
标准化。
动态。例:
var sources = [{a: "A"}, {b: "B"}, {c: "C"}];
options = Object.assign.apply(Object, [{}].concat(sources));
// or
options = Object.assign({}, ...sources);
这是让我感到疑惑的承诺。
这与你问的问题没有直接关系。该代码没有使用,它使用的是执行相同操作的用户代码()。他们似乎正在用Babel编译代码(并将其与Webpack捆绑在一起),这就是我所说的:你可以编译的语法。他们显然更喜欢将其作为依赖项包含在其构建中。Object.assign()
object-assign
object-assign
对于参考对象,休息/传播在 ECMAScript 2018 中作为第 4 阶段完成。该提案可以在这里找到。
对于大多数对象分配和展开的工作方式相同,关键区别在于跨度定义了属性,而 Object.assign() 设置了属性。这意味着 Object.assign() 触发 setters。
值得记住的是,除此之外,对象 rest/spread 1:1 映射到 Object.assign() 并以不同的方式映射到数组(可迭代)传播。例如,当分布数组时,空值是分布的。但是,使用对象展开 null 值会静默地分布到无。
数组(可迭代)展开示例
const x = [1, 2, null , 3];
const y = [...x, 4, 5];
const z = null;
console.log(y); // [1, 2, null, 3, 4, 5];
console.log([...z]); // TypeError
对象跨页示例
const x = null;
const y = {a: 1, b: 2};
const z = {...x, ...y};
console.log(z); //{a: 1, b: 2}
这与 Object.assign() 的工作方式一致,两者都以静默方式排除 null 值,而不会出现错误。
const x = null;
const y = {a: 1, b: 2};
const z = Object.assign({}, x, y);
console.log(z); //{a: 1, b: 2}