实现 Symbol.iterator 方法 让一个普通对象变成 可迭代对象(iterable)

99 阅读1分钟

fakeArray 是一个类数组我们把它赋能为数组 可以利用数组的方法来实现快捷的操作

比如可以使用 1 for of

特性for...offor...in
遍历内容可迭代对象的值对象的可枚举属性(包括原型链上的)
适用对象数组、字符串、Map、Set 等可迭代对象普通对象
顺序保证按迭代器定义的顺序不保证顺序(依赖于 JavaScript 引擎)
原型链属性不遍历会遍历

2 [...arr] 方式赋值

方法1

const fakeArray = { 0: 'a', 1: 'b', length: 2 };
fakeArray[Symbol.iterator] = function () {
    return Array.prototype.values.call(this);
}
console.log([...fakeArray]); // ['a', 'b']

方法2

const fakeArray = { 0: 'a', 1: 'b', length: 2 };
fakeArray[Symbol.iterator] = function (){
    let idx = 0;
    return { // 迭代器,每次迭代的时候调用的方法
        next:()=>{
            return {value:this[idx],done:idx++ === this.length}
        }
    }
}
console.log([...fakeArray]); // ['a', 'b']

方法3

const fakeArray = { 0: 'a', 1: 'b', length: 2 };
fakeArray[Symbol.iterator] = function* () {
    for (let i = 0; i < this.length; i++) {
      yield this[i];
    }
  }

console.log([...fakeArray]); // ['a', 'b']