gpt4 book ai didi

javascript - 在数组与对象中传播未定义

转载 作者:行者123 更新时间:2023-12-03 00:55:32 25 4
gpt4 key购买 nike

为什么在对象中传播 undefined 会返回空对象? {...undefined}//等于 {}:

console.log({...undefined})

为什么在数组中传播 undefined 会给你一个错误?[...undefined]//类型错误:

console.log([...undefined])

最佳答案

正如评论中所指出的,以及@ftor从 #687 中总结的,对象传播相当于 1Object.assign() (问题 #687#45 ),而数组文字上下文中的传播是可迭代传播。

引用Ecma-262 6.0 , Object.assign()定义为:

19.1.2.1 Object.assign ( target, ...sources )

The assign function is used to copy the values of all of the enumerable own properties from one or more source objects to a target object. When the assign function is called, the following steps are taken:

  1. Let to be ToObject(target).
  2. ReturnIfAbrupt(to).
  3. If only one argument was passed, return to.
  4. Let sources be the List of argument values starting with the second argument.
  5. For each element nextSource of sources, in ascending index order, do
    1. If nextSource is undefined or null, let keys be an empty List.
    2. Else, ...

...后面是复制自身属性的描述。对象休息/传播属性的草案是 here 。它不是 Ecma-262 6.0 的一部分。

一个SpreadElement数组文字表达式的定义如下:

SpreadElement : ... AssignmentExpression

  1. Let spreadRef be the result of evaluating AssignmentExpression.
  2. Let spreadObj be GetValue(spreadRef).
  3. Let iterator be GetIterator(spreadObj).
  4. ReturnIfAbrupt(iterator).

undefined开始没有带有键 @@iterator 的属性,根据GetIterator的步骤抛出TypeError。 。该标准不容易阅读,但如果我没有记错的话,错误路径是 GetIterator -> GetMethod -> GetV -> ToObject ,这会引发未定义和 null 的 TypeError。

在数组初始化中使用可能具有未定义值的变量的一个简单补救方法是使用默认值:

const maybeArray = undefined;
const newArray = [ ...(maybeArray || []) ];
<小时/>

1:how setters are handled 中存在差异.

关于javascript - 在数组与对象中传播未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47155141/

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