对象传播与对象分配跨页语法Object.assign()

2022-08-29 23:00:15

假设我有一个变量,我想设置一些默认值。options

这两种选择的优点/缺点是什么?

使用对象跨页

options = {...optionsDefault, ...options};

或使用 Object.assign

options = Object.assign({}, optionsDefault, options);

这是让我感到疑惑的承诺


答案 1

这不一定是详尽无遗的。

跨页语法

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);
    

弊:

  • 更详细。
  • 如果在没有本机支持的环境中创作代码以执行,则需要 polyfill。

这是让我感到疑惑的承诺。

这与你问的问题没有直接关系。该代码没有使用,它使用的是执行相同操作的用户代码()。他们似乎正在用Babel编译代码(并将其与Webpack捆绑在一起),这就是我所说的:你可以编译的语法。他们显然更喜欢将其作为依赖项包含在其构建中。Object.assign()object-assignobject-assign


答案 2

对于参考对象,休息/传播在 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}