对象扩展语法永远不会抛出错误吗?

Posted

技术标签:

【中文标题】对象扩展语法永远不会抛出错误吗?【英文标题】:Does the Object spread syntax never throw an error? 【发布时间】:2020-06-06 07:11:18 【问题描述】:

我注意到 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') );

在对象字面量中传播时,是否存在无效的类型、类或值(即引发任何类型的错误)?当然,不包括未捕获的拒绝承诺。

【问题讨论】:

【参考方案1】:

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

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

在12.2.6 Object Initializer,我们找到了对象字面量扩展语法的语法定义:

PropertyDefinition... AssignmentExpression[+In, ?Yield, ?Await]

AssignmentExpression 表示所有可能的表达式(包括赋值),但逗号运算符除外,这实际上意味着如果您希望将逗号解释为逗号运算符而不是对象字面量的逗号分隔符(参见12.15 Assignment Operators 和12.16 Comma Operator)。

评估程序在12.2.6.8 Runtime Semantics: PropertyDefinitionEvaluation中指定:

PropertyDefinition:...AssignmentExpression

    exprValue 为评估 AssignmentExpression 的结果。 让 fromValue 是 ?获取值(exprValue)。 让 excludedNames 成为一个新的空列表。 返回 ? CopyDataProperties(object, fromValue, excludedNames)。

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

    如果 sourceundefinednull,则返回 target。 让成为! ToObject(来源)。

现在,当 sourcenullundefined 时,ToObject 会抛出异常,但这两种情况在前面的步骤中已被处理(作为无操作)。所有其他原始值都被装箱到一个包装对象中(请参阅7.1.18 ToObject)。

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

    c。 2. 二。履行 ! CreateDataPropertyOrThrow(target, nextKey, propValue).

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

【讨论】:

以上是关于对象扩展语法永远不会抛出错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果 firebase 文档不存在则抛出错误

PHPunit - 错误

在这种情况下永远不会抛出这个 AssertionError 吗?

GWT 2.5.1编译始终抛出Java堆空间错误

对象扩展运算符在 Microsoft Edge 中抛出错误

Clickhouse 创建表查询抛出语法错误