为什么array.concat(obj)需要设置obj的@@isConcatSpreadable和length后才能正常的执行?

发布于 2022-09-12 04:26:46 字数 615 浏览 22 评论 0

执行如下代码:

const array = ['a', 'b', 'c'];
let obj = {0:1,1:2 }
console.log(array.concat(obj));

// 设置 obj 的 @@isConcatSpreadable
obj[Symbol.isConcatSpreadable] = true;
console.log(array.concat(obj));

// newObj同时存在length和@@isConcatSpreadable
let newObj = {0:1,1:2,length:2 }
newObj[Symbol.isConcatSpreadable] = true;
console.log(array.concat(newObj));

其输出为

["a", "b", "c", { 0: 1, 1: 2 }]
["a", "b", "c"]
["a", "b", "c", 1, 2]

为什么需要同时设置obj[Symbol.isConcatSpreadable]length后才能如期望的执行concat?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

在巴黎塔顶看东京樱花 2022-09-19 04:26:46

数组的 concat() 实例方法的参数,要么是新的元素,要么是新的数组。
一般来说,对象作为数组的 concat() 实例方法的参数,相当于一个独立的新元素。
但是把一个特殊的类数组对象传入,同时该对象还实现了 [Symbol.isConcatSpreadable] API,意味着对象作为被数组的 concat() 实例方法使用的时候允许被展开,相当于 array.concat(...newObj),从该 [Symbol.isConcatSpreadable] 的接口名字就能看出。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文