You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过原型为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:24:25