对象内展开undefined与数组内展开undefined的行为差异疑问
两种场景执行结果差异的核心原因是对象展开运算符和迭代展开运算符的底层规范逻辑完全不同:
1. { 2, {...undefined} }返回空对象的原因
- ECMAScript 2018引入对象展开特性时,明确规定:如果对象展开运算符的操作数是
undefined或null,会直接当做空对象处理,没有任何可枚举属性会被合并到目标对象中。 - 这段代码里
{...undefined}等价于{},最终合并后的对象无有效属性,所以返回空对象{}。
2. { 2, [...undefined] }抛出类型错误的原因
- 用在数组字面量、函数参数等场景的展开运算符属于迭代展开,规范要求被展开的操作数必须是实现了
Symbol.iterator接口的可迭代对象。 undefined本身没有部署Symbol.iterator接口,不属于可迭代对象,执行[...undefined]时会直接触发类型错误,提示undefined is not iterable。
内容的提问来源于stack exchange,提问作者Prasanth Kanna
相关产品推荐
相关产品推荐

