Symbol.iterator 在调用时神秘地更改为 null 或未定义

问题描述 投票:0回答:1

我有一个包装数组的 JavaScript 类。班级看起来像这样。

class Store {
    constructor() {
        this._store = [];
    }
}

我正在尝试定义一个

Symbol.iterator
,因此可以使用例如
for (... of ...)
循环来迭代类实例。

该类的设计方式是,

_store
参数可以是
null
。我按照此定义
Symbol.iterator
函数的解决方案如下

class Store {
    ...

    [Symbol.iterator]() {
        return (this._store || [])[Symbol.iterator]();
    }
}

其背后的想法是,如果

_store
包含一个数组,则此代码将返回
_store[Symbol.iterator]
,否则它将返回空数组的迭代器。

如果

console.log
-ged,则以下表达式似乎是一个函数,正如预期的那样。

console.log( (this._store || [])[Symbol.iterator] )

但是,一旦调用该函数,就会抛出以下错误,该错误指向调用该函数的代码。

TypeError: Cannot convert undefined or null to object

对于为什么会发生这种情况有什么想法吗?

javascript arrays iterator typeerror
1个回答
0
投票

如果您确保使用正确的

this
值调用迭代器函数,那么它就可以正常工作:

class Store {
    _store;
    constructor(arr) {
        this._store = arr;
    }

    [Symbol.iterator]() {
        const dummy = [];
        const iterator = this._store?.[Symbol.iterator]?.bind(this._store) ??
            dummy[Symbol.iterator].bind(dummy);
        return iterator();
    }
}

let store1 = new Store(["hello", "world"]);
for (let s of store1) console.log("store: " + s);

let store2 = new Store();
for (let s of store2) console.log("store 2: " + s);

© www.soinside.com 2019 - 2024. All rights reserved.