关于ES6中的展开语法

通常我们都这样写代码:

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函数,为什么对象也可以用扩展运算符呢?

阅读 2.5k
1 个回答

扩展运算符分为两种。一种是用在函数参数、数组展开的场合,这种情况要求对象是可迭代的(iterable)

另一种是用于对象展开,也就是 {…obj} 形式,这种情况需要对象是可枚举的(enumerable)

结论:

之所以以下代码可行,是因为数组对象是可枚举的:

let obj = {...arr};

而以下代码不可行,是因为普通对象默认是不可迭代的:

let arr = [...obj]; // not work
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题