能否以某种方式为下面的语句使用展开运算符而不导致类型错误
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]