通常我们都这样写代码:
var obj = {"name":"xxx"}
console.log({...obj}) //{"name":"xxx"}
或者
var arr = [1,2,3,4]
console.log([...arr]) // [1,2,3,4]
有没有试过这样的写法
var arr = [1,2,3,4]
console.log({...arr}) // {0:1,1:2,2:3,3:4}
但是反过来却不行
var obj = {"name":"xxx"}
console.log([...obj]) //object is not iterable (cannot read property Symbol(Symbol.iterator))
这是问题一
问题二:
经过查资料得知:扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。可是Object.prototype上面并没有Symbol.iterator函数,为什么对象也可以用扩展运算符呢?
扩展运算符分为两种。一种是用在函数参数、数组展开的场合,这种情况要求对象是
可迭代的(iterable)
。另一种是用于对象展开,也就是 {…obj} 形式,这种情况需要对象是
可枚举的(enumerable)
。结论:
之所以以下代码可行,是因为数组对象是
可枚举
的:而以下代码不可行,是因为普通对象默认是
不可迭代
的: