如何让var[a,b] = {a: 1,b:2}解构赋值成功呢?

116 阅读2分钟

前言

在Javascript中,解构赋值语法的左侧是一个数组,而右侧是一个具有迭代器的对象(数组、map、set),如下var [a,b] = {a: 1,b: 2},如何这个等式成立呢?如果直接将对象解构赋值给数组会导致语法错误。怎么解决呢?让我们看看下面的思路吧。

一般思路

一般第一印象就是对象的解构赋值如:var {a,b} = {a: 1,b: 2},这种解构赋值没错,但并不是上面想要的结果,那会是两边都是数组吗?也不对,题目就是要对象赋值给数组。这个时候我们看到报错信息TypeError: ....is not iterable,没错,迭代器的问题,接下来就围绕迭代器展开,我们知道数组具有标准的迭代器,而对象不具有迭代器属性的数据结构,一般for...of只能遍历具有迭代器的属性的,我们看到数组肯定具有此属性,并且数组原型上有symbol.iterator属性,我们打印出来看到如下:

console.log(arr.__proto__[Symbol.iterator]()); // Object [Array Iterator] {}

我们看到迭代器具有[Symbl.iterator]这样一个属性,并且是函数体,也就是只要返回这个的话数据结构解释可迭代的了。那好就对像增加这样一个属性不就完了吗?

`Object.protutype[Symbol.iterator] = function() { // 使用 Object.values(this)方法获取对象所有值,并返回这些值的迭代器对象 return Object.values(this)Symbol.iterator

}`

这个时候上面对象其实就调用了给它新增的迭代器属性了,通过这种方式我们就可以让所有js对象具有迭代能力了,也就可以使用for...of或者...操作符遍历它的所有值了。好了,思路就是这样,有什么建议欢迎大家评论。