每日一题(三五)var obj= {x:1,y:2,z:3} [...obj]//TypeError

能否以某种方式为下面的语句使用展开运算符而不导致类型错误

var obj= {x:1,y:2,z:3}
[...obj];//TypeError
扫描二维码关注公众号,回复: 11620369 查看本文章

解析:

展开语法和 for-of 语句遍历 Iterable 对象定义要遍历的数据,Array 和 Map 是具有默认迭代行为的内置迭代器。对象是不可迭代的,但是可以通过 iterable 和 iterator 协议使它们可迭代。

如果一个对象实现了 @iterator 方法,那么他就是可迭代的,这意味着这个对象(或者他原型链上的一个对象)必须有一个 带有 @iterator 键属性,这个键通常可以通过常量 Symbol.iterator 获得。

var obj = {x:1,y:2,z:3};

obj[Symbol.iterator] = function(){
    let keys = Object.keys(this);
    let index = 0;
    return {
        next:()=>{
            if(index<keys.length){
                return {value:this[keys[index++]]};
            }else{
                return {done:true};
            }
        }
    }
}


console.log([...obj]); // [1,2,3]

还可以通过使用 generator 函数来定制对象的迭代行为:

var obj={x:1,y:2,z:3};
obj[Symbol.iterator] = function*(){
    yield 1;
    yield 2;
    yield 3;
};

[...obj];//[1,2,3]

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/106277184