迭代器模式(Iterator Pattern)是一种行为设计模式,它容许客户端依照特定的形式遍历汇合中的元素,而无需裸露汇合的内部结构。

上面是一个应用 TypeScript 实现的迭代器模式的示例代码:

interface Iterator<T> {  next(): T;  hasNext(): boolean;}class MyArray<T> {  private elements: T[];  constructor() {    this.elements = [];  }  add(element: T) {    this.elements.push(element);  }  getIterator(): Iterator<T> {    return new ArrayIterator(this.elements);  }}class ArrayIterator<T> implements Iterator<T> {  private index: number;  private readonly elements: T[];  constructor(elements: T[]) {    this.index = 0;    this.elements = elements;  }  hasNext(): boolean {    return this.index < this.elements.length;  }  next(): T {    if (this.hasNext()) {      const element = this.elements[this.index];      this.index++;      return element;    }    return null;  }}// Example usage:const myArray = new MyArray<number>();myArray.add(1);myArray.add(2);myArray.add(3);const iterator = myArray.getIterator();while (iterator.hasNext()) {  console.log(iterator.next()); // Output: 1, 2, 3}

在下面的示例中,MyArray 类示意一个数组,它蕴含一个 getIterator 办法,该办法返回一个迭代器对象。ArrayIterator 类是迭代器的具体实现,它实现了 Iterator 接口中定义的 next 和 hasNext 办法。在 next 办法中,咱们首先查看是否有下一个元素,如果有则返回以后元素,并将索引向前挪动。在 hasNext 办法中,咱们查看以后索引是否小于数组的长度,如果是,则返回 true,否则返回 false。

在应用示例中,咱们创立了一个 MyArray 对象,向其中增加了几个元素,并获取了一个迭代器对象。而后,咱们应用 while 循环遍历迭代器对象并输入每个元素。

总的来说,迭代器模式可能让客户端更不便地遍历汇合对象中的元素,同时还能放弃汇合对象的封装性,进步代码的可维护性

在 JavaScript 中,数组是一个常见的汇合对象,咱们常常须要遍历其中的元素。为了进步代码的可读性和可维护性,JavaScript 提供了许多遍历数组的办法,例如 map、forEach、filter、reduce 等。这些办法都是基于迭代器模式实现的,它们会返回一个迭代器对象,使得咱们能够遍历数组中的每个元素,并对它们进行操作。

以下是 JavaScript 中 Array.prototype.map 办法的简略实现和源码:

function map(arr, callback) {  const result = [];  for (let i = 0; i < arr.length; i++) {    result.push(callback(arr[i], i, arr));  }  return result;}

源码实现:

function map(callback, thisArg) {  // 异样解决,和 forEach 一样  if (this == null) {    throw new TypeError('this is null or not defined');  }  // 转为对象  const O = Object(this);  // 无符号右移位运算符,保障 len 为 number,且为正整数  const len = O.length >>> 0;  // 判断 callback 是否为函数  if (typeof callback !== 'function') {    throw new TypeError(callback + ' is not a function');  }  // 返回值数组  const A = new Array(len);  // thisArg 为 callback 函数的 this 值  let k = 0;  while (k < len) {    // in 操作符判断属性是否存在    if (k in O) {      const kValue = O[k];      // 调用 callback 函数,并传入 thisArg、以后值、索引、整个数组      const mappedValue = callback.call(thisArg, kValue, k, O);      // 赋值      A[k] = mappedValue;    }    k++;  }  return A;};

Array.prototype.map 办法能够承受一个回调函数作为参数,该函数会被遍历数组中的每个元素调用,并将每个元素转换为一个新的值。在实现中,map 办法会创立一个新的数组,用于存储每个元素的新值,最初返回这个新数组。

在源码中,map 办法首先对传入的 this 值进行了异样解决,而后将其转换为对象。接着,它应用位运算符将数组长度转换为正整数,并判断传入的回调函数是否为函数类型。而后,它创立一个新的数组,应用 while 循环遍历数组中的每个元素,调用回调函数对每个元素进行转换,并将转换后的值存储在新数组中。

最初,map 办法返回新数组,实现整个操作。