var [a, b] = { a: 1, b: 2}
首先观察当前报错,意为 = 右侧的对象不可迭代。
ES6中的可迭代协议表示,任何一个对象中,只要包含符号属性 [Symbol.iterator],并且该属性为返回一个迭代器的函数,那么该对象就是可迭代对象。
常见的可迭代对象是数组,通过打印可以看到符号属性 [Symbol.iterator] 的函数如下。
该函数返回一个迭代器,打印如下:
调用迭代器的next方法,可以得到可迭代对象的下一项。
回归题目可以发现:var [a, b] = { a: 1, b: 2}是想从对象中解构出a和b,由于ES6规定只能解构可迭代对象,此时需要将 = 右侧对象变为可迭代对象。
实现
- 由于无法直接修改题目(直接给右侧对象加符号属性),就需要加到原型上。
- Object.values(this)拿到对象值的数组
- 将数组的迭代器返回
Object.prototype[Symbol.iterator] = function () {
return Object.values(this)[Symbol.iterator]()
}
至此,表达式成立