为什么array.concat(obj)需要设置obj的@@isConcatSpreadable和length后才能正常的执行?
执行如下代码:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
数组的
concat()
实例方法的参数,要么是新的元素,要么是新的数组。一般来说,对象作为数组的
concat()
实例方法的参数,相当于一个独立的新元素。但是把一个特殊的类数组对象传入,同时该对象还实现了
[Symbol.isConcatSpreadable]
API,意味着对象作为被数组的concat()
实例方法使用的时候允许被展开,相当于array.concat(...newObj)
,从该[Symbol.isConcatSpreadable]
的接口名字就能看出。