能否通过原型为Object添加Symbol.iterator?为何赋值后对象仍不可迭代?
关于为Object原型添加Symbol.iterator的问题
问题1:能不能给Object原型加Symbol.iterator?
能,但强烈不建议这么干。你确实可以给Object.prototype挂载Symbol.iterator属性,让所有普通对象都变成可迭代的,但这种全局原型污染操作风险很高——其他代码(比如第三方库)可能依赖对象默认不可迭代的特性,这么改很容易引发意料之外的bug。
问题2:为啥你写的代码加不了Symbol.iterator?
看你贴的代码:
Object.prototype[Symbol.iterator]; let obj = {num: 1 , type : ' :) '} for (let p of obj) { console.log(p); } // TypeError: obj is not iterable
你这只是读取了Object.prototype[Symbol.iterator]这个属性,根本没给它赋值一个迭代器函数啊!这个属性默认是undefined,所以obj自然不满足可迭代对象的要求,报错是必然的。
要真的让对象可迭代,得给Object.prototype[Symbol.iterator]赋值一个符合迭代器规范的函数,比如让它遍历对象的键值对:
Object.prototype[Symbol.iterator] = function*() { for (const key of Object.keys(this)) { yield [key, this[key]]; } }; let obj = {num: 1 , type : ' :) '} for (let p of obj) { console.log(p); } // 输出: ['num', 1], ['type', ' :) ']
这样就能正常用for...of遍历了。核心点是:可迭代对象必须要有一个能返回迭代器的Symbol.iterator方法,你之前的代码只是读了这个属性,没定义它的实际功能。
内容的提问来源于stack exchange,提问作者bardala
相关产品推荐
相关产品推荐

