- 45
- 0
在对象上使用自定义的Symbol.iterator方法会造成死循环?
产生死循环的原因是什么?
var randoms = {
[Symbol.iterator]: function (){
return {
next: function (){
return {value: Math.random().toFixed(2)};
}
};
}
};
var randoms_pool = [];
for(var n of randoms){
randoms_pool.push(n);
if(randoms_pool.length === 10) break; // 人为中断
}
console.log(randoms_pool);
- 共 0 条
- 全部回答
-
疯小五 普通会员 1楼
在JavaScript中,Symbol.iterator方法用于创建一个迭代器对象,用于遍历可迭代对象(如数组、Set、Map等)中的元素。当自定义Symbol.iterator方法时,如果在迭代过程中抛出了异常,如TypeError或RangeError,那么在每次迭代后,会抛出一个特殊的错误,这就是所谓的"Symbol.iterator引发的死循环"。
具体原理如下:
- 自定义Symbol.iterator方法:
- 通常情况下,你可以使用以下形式来创建一个自定义迭代器:
```javascript class MyIterator { constructor(iterable, callback) { this.iterable = iterable; this.callback = callback || (e => e); }
next() { try { const value = this.iterable.next(); if (value.done) { this.callback(null); return; } this.callback(value.value); } catch (error) { this.callback(error); return; } } } ```
- 使用Symbol.iterator方法:
- 创建一个迭代器对象,并指定一个回调函数作为迭代器的next方法的参数。例如,我们可以创建一个名为myArray的迭代器对象,然后调用next方法来遍历数组中的元素:
javascript const myArray = [1, 2, 3, 4, 5]; const myIterator = new MyIterator(myArray, (value) => value * 2); console.log(myIterator.next()); // 输出: {done: false, value: 2}- 异常处理:
-
在迭代过程中,当迭代器对象调用next方法时,会尝试访问并执行迭代对象的next方法。如果该方法抛出一个错误,如TypeError或RangeError,那么在调用next方法时,会抛出一个特殊的错误,这个错误将作为迭代器对象的内部错误。
-
然后,迭代器对象调用next方法的回调函数,传入引发错误的值。如果回调函数抛出一个错误,那么迭代器对象将返回一个值,即引发错误的值,然后调用next方法的回调函数,传入下一个迭代的元素。如果后续的回调函数抛出一个错误,那么将会一直重复这个过程,导致迭代器对象陷入死循环。
-
死循环问题:
-
如果在迭代过程中没有抛出任何错误,那么在调用next方法的回调函数时,将会返回迭代器对象自身的值,即迭代器对象本身。这样,后续的回调函数就会继续执行,即使已经迭代了整个迭代器对象,也无法获取到真正的元素值。
-
此时,由于触发错误的回调函数一直在执行,从而形成了一个死循环,导致迭代器对象无法停止迭代。
因此,当自定义Symbol.iterator方法时,如果在迭代过程中抛出了异常,那么在每次迭代后,会抛出一个Symbol.iterator引发的死循环错误。需要注意的是,如果你不处理这个错误,而是让迭代器对象继续执行,那么在不满足条件时,可能会导致无限循环,最终导致程序崩溃。在这种情况下,你可能需要添加错误处理代码,或者在迭代过程中捕获和处理异常,以避免陷入死循环。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

