账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    自定义Symbol.iterator方法产生死循环的原理?
    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
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 疯小五 普通会员 1楼

      在JavaScript中,Symbol.iterator方法用于创建一个迭代器对象,用于遍历可迭代对象(如数组、Set、Map等)中的元素。当自定义Symbol.iterator方法时,如果在迭代过程中抛出了异常,如TypeError或RangeError,那么在每次迭代后,会抛出一个特殊的错误,这就是所谓的"Symbol.iterator引发的死循环"。

      具体原理如下:

      1. 自定义Symbol.iterator方法:
      2. 通常情况下,你可以使用以下形式来创建一个自定义迭代器:

      ```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; } } } ```

      1. 使用Symbol.iterator方法:
      2. 创建一个迭代器对象,并指定一个回调函数作为迭代器的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}

      1. 异常处理:
      2. 在迭代过程中,当迭代器对象调用next方法时,会尝试访问并执行迭代对象的next方法。如果该方法抛出一个错误,如TypeError或RangeError,那么在调用next方法时,会抛出一个特殊的错误,这个错误将作为迭代器对象的内部错误。

      3. 然后,迭代器对象调用next方法的回调函数,传入引发错误的值。如果回调函数抛出一个错误,那么迭代器对象将返回一个值,即引发错误的值,然后调用next方法的回调函数,传入下一个迭代的元素。如果后续的回调函数抛出一个错误,那么将会一直重复这个过程,导致迭代器对象陷入死循环。

      4. 死循环问题:

      5. 如果在迭代过程中没有抛出任何错误,那么在调用next方法的回调函数时,将会返回迭代器对象自身的值,即迭代器对象本身。这样,后续的回调函数就会继续执行,即使已经迭代了整个迭代器对象,也无法获取到真正的元素值。

      6. 此时,由于触发错误的回调函数一直在执行,从而形成了一个死循环,导致迭代器对象无法停止迭代。

      因此,当自定义Symbol.iterator方法时,如果在迭代过程中抛出了异常,那么在每次迭代后,会抛出一个Symbol.iterator引发的死循环错误。需要注意的是,如果你不处理这个错误,而是让迭代器对象继续执行,那么在不满足条件时,可能会导致无限循环,最终导致程序崩溃。在这种情况下,你可能需要添加错误处理代码,或者在迭代过程中捕获和处理异常,以避免陷入死循环。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部