gpt4 book ai didi

javascript - 对象传播语法永远不会抛出错误吗?

转载 作者:行者123 更新时间:2023-12-04 11:30:52 25 4
gpt4 key购买 nike

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


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

最佳答案

不,没有表达式在对象字面量中传播时是无效的,当然前提是对该表达式本身的评估不会引发错误。
我们可以从 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

  1. Let exprValue be the result of evaluating AssignmentExpression.
  2. Let fromValue be ? GetValue(exprValue).
  3. Let excludedNames be a new empty List.
  4. Return ? CopyDataProperties(object, fromValue, excludedNames).

我们假设表达式本身在求值期间不会抛出,这意味着上面的 GetValue 过程将成功而不会出错。然后我们可以检查 CopyDataProperties 在 7.3.25 CopyDataProperties 中的作用。 .重要的步骤是:
  1. If source is undefined or null, return target.
  2. Let from be ! ToObject(source).

现在 ToObject 将在 source 为 null 时抛出或 undefined ,但是这两种情况在前面的步骤中已经被处理(作为无操作)。所有其他原始值都被装箱到一个包装对象中(参见 7.1.18 ToObject)。
最后,CopyDataProperties 还有一个步骤可以抛出:
  1. c. 2. ii. Perform ! CreateDataPropertyOrThrow(target, nextKey, propValue).

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

关于javascript - 对象传播语法永远不会抛出错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60345700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com