Symbol.iterator调用时莫名变为null/undefined的原因排查
问题原因分析
你的代码报错核心是函数调用时的this指向丢失。
当你把(this._store || [])[Symbol.iterator]赋值给iterator变量后,调用iterator()时,这个函数内部的this不再指向原数组(或者你兜底的空数组):在非严格模式下它会指向全局对象,严格模式下则是undefined。而数组的Symbol.iterator方法必须依赖数组实例作为this才能正常初始化迭代器,因此触发了Cannot convert undefined or null to object的错误。
举个极简的例子就能复现这个问题:
const arr = []; const iterFn = arr[Symbol.iterator]; iterFn(); // 同样会抛出TypeError,因为this不再指向arr
而你直接写this._store[Symbol.iterator]()时,函数是通过对象属性访问链调用的,此时this会自动绑定到this._store这个数组实例上,所以能正常工作。
修复方案
有两种简洁的修复方式:
- 方式一:用
call强制绑定this
[Symbol.iterator]() { const target = this._store || []; return target[Symbol.iterator].call(target); }
- 方式二:直接调用目标数组的迭代器方法(更直观)
[Symbol.iterator]() { return (this._store || [])[Symbol.iterator](); }
两种方式都能保证Symbol.iterator方法执行时,this指向对应的数组实例,避免报错。
内容的提问来源于stack exchange,提问作者Ennol1
相关产品推荐
相关产品推荐

