拆开JavaScript迭代器模式内部黑盒子

 更新时间:2022年12月22日 09:08:09   作者:qb  
这篇文章主要为大家介绍了JavaScript迭代器模式内部黑盒子解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、内部迭代器

迭代器模式,指的是提供一种方法顺序访问一个聚合对象或者数组中的各种元素,而又不暴露该对象的内部表示。

内部迭代器是自动的,将回调函数传入迭代器进行执行,访问到每一个元素都会执行传入迭代器中的回调函数。

模拟内部迭代器如下:

// 定义数组原型上的mapFn内部迭代器
Array.prototype.mapFn = function (callback) {
    let arr = this;
    let newArr = []
    for (let i = 0; i < arr.length; i++) {
        newArr[i] = callback(arr[i], i, arr)
    }
    return newArr
}
// 定义原始数组
var arr = [1, 2, 3, 4, 5];
// 定义回调函数
var callback = val => val * 2;
// 执行数组的mapFn方法调用回调函数callback
var newArr = arr.mapFn(callback);
// 打印返回值
console.log(newArr)

callback函数可以传入三个参数,第一个参数表示当前的值,第二个参数表示当前索引,第三个参数表示正在操作的数组。返回值为新数组。

当前例子中,callback指的是val => val * 2,通过数组的mapFn方法执行callback函数,返回值为新的数组newArr

在实际的使用中,Array.prototype.mapFn的内部实现是看不到的,就像我们看不到数组的操作mapforEach一样,这里如果将Array.prototype.mapFn作为黑盒子。就有如下的流程:

二、外部迭代器

外部迭代器是非自动的,提供了next方法,需要手动的去执行next()以进行下一个元素的访问。

// 定义迭代器生成函数
function makeIterator(array) {
    var nextIndex = 0;
    return {
        next: function () {
            return nextIndex < array.length ? {
                value: array[nextIndex++],
                done: false
            } : {
                value: undefined,
                done: true
            };
        }
    };
}
// 产生迭代器
var it = makeIterator(['a', 'b']);
// 通过迭代器暴露出来的next方法,外部调用迭代器
console.log(it.next()) // { "value": "a", "done": false }
console.log(it.next()) // { "value": "b", "done": false }
console.log(it.next()) // { "value": undefined, "done": true }

makeIterator返回next方法,每一次执行都会执行下一个迭代。done是否迭代结束,value是当前迭代获取到的值。如果donetrue,对应的value就是undefined

在实际的使用中,makeIterator的内部实现是看不到的,这里如果将makeIterator作为黑盒子。就有如下的流程:

总结:

目前JavaScript已经内置了多种内部迭代器,比如forEachmapfilterreduce等,内部执行回调函数function(value, index, currentArr){ xxxx }对每个访问到的元素进行处理。通过generateyield配合使用也可以产生外部迭代器,通过next()方法进行下一步的执行。

以上就是拆开JavaScript迭代器模式内部黑盒子的详细内容,更多关于JavaScript迭代器模式内部黑盒子的资料请关注脚本之家其它相关文章!

相关文章

  • js实现点赞效果

    js实现点赞效果

    这篇文章主要为大家详细介绍了js实现点赞效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 原生js实现上传图片控件

    原生js实现上传图片控件

    这篇文章主要为大家详细介绍了原生js实现上传图片控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 终于解决了IE8不支持数组的indexOf方法

    终于解决了IE8不支持数组的indexOf方法

    今天,测试报过来一个js bug, 在IE8下有个js错误,但是在其它浏览器下(Firefox, Chrome, IE9)下面都很正常。后来调试发现原因是在IE8下,js数组没有indexOf方法。
    2013-04-04
  • 微信公众号获取用户地理位置并列出附近的门店的示例代码

    微信公众号获取用户地理位置并列出附近的门店的示例代码

    这篇文章主要介绍了微信公众号获取用户地理位置并列出附近的门店的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • JavaScript ES2019中的8个新特性详解

    JavaScript ES2019中的8个新特性详解

    这篇文章主要介绍了JavaScript ES2019中的8个新特性详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • JavaScript实现新年倒计时效果

    JavaScript实现新年倒计时效果

    这篇文章主要为大家详细介绍了JavaScript实现新年倒计时效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 关于javascript中json 对象数组之间相互转化问题

    关于javascript中json 对象数组之间相互转化问题

    这篇文章主要介绍了关于javascript中json 对象数组之间相互转化问题,在实际应用中,JSON对象和数组的结构可能更加复杂,需要根据具体情况进行相应的处理和转换,需要的朋友可以参考下
    2023-07-07
  • JS实现获取剪贴板内容的方法

    JS实现获取剪贴板内容的方法

    这篇文章主要介绍了JS实现获取剪贴板内容的方法,涉及javascript基于clipboardData操作剪贴板的相关技巧,需要的朋友可以参考下
    2016-06-06
  • JavaScript中的for...of和for...in循环容易遇到的问题及解决方法总结

    JavaScript中的for...of和for...in循环容易遇到的问题及解决方法总结

    在 JavaScript 编程中,for...of 和 for...in 是常用的循环语法,但它们在使用时可能会引发一些意想不到的问题,本文将分享我在使用这两种循环时所遇到的坑和经验,需要的朋友可以参考下
    2023-08-08
  • Vue formData实现图片上传

    Vue formData实现图片上传

    这篇文章主要为大家详细介绍了Vue formData实现图片上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论