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

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

var obj= {x:1,y:2,z:3}
[...obj];//TypeError

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解析:

展开语法和 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]

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值