每日一题
var obj = {x: 1, y: 2, z: 3};
[...obj]
能否以某种方式为上面的语句是用展开运算而不导致类型错误,如果可以,写出解决方式
答案:可以。解决方式见解析
解析:
展开语法和for...of语句遍历iterable对象定义要遍历的数据。
Array和Map是具有默认迭代行为的内置迭代器。对象不是可迭代的,但是可以通过使用iterable和iterator协议使他们可迭代。
在Mozilla文档中,如果一个对象实现了@iterabtor方法,那么他就是可迭代的,这意味着这个对象(或者他的原型链上的一个对象)
必须有一个带有@iterator键的属性,这个键可以通过常量Symbol.iterator获得。
//解决方式一
var obj = { x: 1, y: 2, z: 3 };
obj[Symbol.iterator] = function(){
//iterator 是一个具有next方法的对象
//他的返回至少有一个对象
//两个属性: value & done。
return {
//返回一个iterator对象
next: function(){
if(this._countDown === 7){
// const lastValue = this._countDown;
return { value: this._countDown, done: true };
}
this._countDown = this._countDown + 1;
return { value: this._countDown, done: false };
},
_countDown: 0,
};
};
console.log([...obj])
控制台执行结果:
image.png
网友评论