javascript - 在 JavaScript 中,为什么任何值都可以散布在对象中,而不能散布在数组中?
问题描述
在对象中传播任何“空”值都是有效的(不会引发错误,而是成为一种无操作):
{
...undefined,
...null,
...false,
...true,
...'',
...{},
...[],
...Symbol(),
...() => {},
} // evaluates to {}
但是在数组中执行相同操作会引发除''
和之外的所有上述值的错误[]
。错误消息说不起作用的值是不可迭代的,但是,它们显然是可迭代的,因为它们可以传播到一个对象中。诚然,从直觉上讲,字符串、数组和对象在传播到对象时可以转换为条目/键值对,在传播到数组中时可以转换为值,但即便如此,为什么所有这些的条目值是可迭代的,但值不是?如果条目是可迭代的,那么值不应该也是如此吗?这只是不同 JavaScript 引擎的怪癖吗?这里发生了什么?
解决方案
在对象字面量中,将提供的对象中的spread operator
可枚举属性复制到新对象上。因此,在您的示例中,为展开运算符提供的“实体”都没有任何可枚举的属性。
对于数组,展开语法仅适用于可迭代对象。
或实现迭代器协议的对象......含义:
对象(或其原型链上的对象之一)必须具有带有 @@iterator 键的属性,该键可通过常量 Symbol.iterator 获得
这样做的核心对象是:
推荐阅读
- xcode - 文本视图正在更改输入字符
- powershell - PowerShell CSV,从每一行中取出特定行并将其合并为一个 CSV
- sql - Excel 与 SQL 表在插入和搜索行时的性能
- c++ - 使用布尔方法将 99 瓶啤酒挂在墙上
- javascript - 为什么我在javascript中记录它们时,类和函数中的函数有不同的表达方式?
- java - 使用 Varargs 调用方法时出现 javassist.CannotCompileException
- c# - C# 编译成程序集。为什么运行更少的汇编指令需要更长的时间?
- asp.net-core - 带有输入和表单的 AJAX 选项卡 .Net Core
- python - 如何将变量放入 geolocator.reverse() 函数?
- java - 如何在 HTTP 请求中发送 java 对象?