Object spread语法是否从不抛出错误



我注意到Object Spread语法对它可以接受的值类型非常宽容:

console.log({ ...true });
console.log({ ...false });
console.log({ ...0 });
console.log({ ...42 });
console.log({ ...-1 });
console.log({ ...NaN });
console.log({ ...'batman' });
console.log({ .../w+[0-9a-fA-F]?/ });
console.log({ ...['foo', 'bar', 42] });
console.log({ ...undefined });
console.log({ ...false });
console.log({ ...Symbol('hmm') });
console.log({ ...Promise.resolve('resolved') });
console.log({ ...Promise.reject('rejected') });

在对象文字中传播时,是否存在无效的类型、类或值(即引发任何类型的错误(?当然,这还不包括未兑现的被拒绝的承诺。

不,在对象文字中传播时没有无效的表达式,当然,前提是该表达式本身的求值不会引发错误。

我们可以从ECMAScript规范中看到这是真的:

在12.2.6 Object Initializer中,我们找到了Object literal spread语法的语法定义:

属性定义
...赋值表达式[+In,?Yield,?Await]

AssignmentExpression表示除逗号运算符之外的所有可能的表达式(包括赋值(,这实际上意味着,如果希望将逗号解释为逗号运算符而不是对象文字的逗号分隔符,则需要使用圆括号(请参阅12.15赋值运算符和12.16逗号运算符(。

12.2.6.8运行时语义:属性定义评估:中规定了评估程序

属性定义:...分配表达式

  1. exprValue为评估AssignmentExpression的结果
  2. fromValue为?GetValue(exprValue(
  3. excludedNames成为一个新的空列表
  4. 返回?CopyDataProperties(对象fromValue排除名称(

我们假设表达式本身在求值期间不会抛出,这意味着上面的GetValue过程将毫无错误地成功。然后,我们可以在7.3.25 CopyDataProperties中检查CopyDataProperty的作用。重要步骤是:

  1. 如果undefinednull,则返回目标
  2. 让中的成为!ToObject((

现在ToObject将在nullundefined时抛出,但这两种情况已在前一步骤中处理(作为无操作(。所有其他基元值都被装箱到一个包装器对象中(参见7.1.18 ToObject(。

最后,CopyDataProperties还有一个可以抛出的步骤:

  1. c。2.ii。表演CreateDataPropertyOrThrow(目标nextKeypropValue(

但是,只有当要设置的属性已经存在且不可配置,或者目标对象不可扩展时,才能抛出(请参见7.3.7 CreateDataPropertyOrThrow和7.3.5 CreateDataProperty(。但这样的条件不会出现在对象文字中。它们可能发生在扩展对象的较大评估中,但这些错误与扩展语法无关,特别是。

相关内容

最新更新