ES9 Iterable 和 Array Like 对象之间的互操作

在前端开发中,我们经常需要处理一些数据结构,比如数组、对象、字符串等等。在这些数据结构中,数组是最常见的一种。在 JavaScript 中,数组是一个非常灵活的数据结构,但是有时候我们会遇到一些类似数组的对象,比如 NodeList、arguments 等等,这些对象称为 Array Like 对象。

ES9 引入了一个新的特性,叫做 Iterable,可以让我们更方便地操作类似数组的对象。本文将介绍 Iterable 和 Array Like 对象之间的互操作,帮助读者更好地理解和使用这些特性。

Iterable

Iterable 是一种新的数据类型,表示可以被迭代的对象。在 JavaScript 中,一个对象如果实现了 Iterable 接口,那么它就可以被 for...of 循环遍历。

Iterable 接口只有一个方法,就是 Symbol.iterator 方法。这个方法返回一个迭代器对象,这个迭代器对象必须包含一个 next 方法,这个方法返回一个对象,包含两个属性,value 和 done。

下面是一个简单的示例:

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();

console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: undefined, done: true }

在这个示例中,我们首先获取了一个数组的迭代器对象,然后使用 next 方法逐个访问数组元素。当访问完所有元素之后,再调用一次 next 方法,返回的对象的 done 属性为 true。

除了数组,还有很多其他的数据结构也实现了 Iterable 接口,比如 Set、Map、String 等等。这些数据结构可以被 for...of 循环遍历。

Array Like 对象

Array Like 对象是指那些具有 length 属性,但是没有数组的一些方法的对象。比如 NodeList、arguments 等等。这些对象看起来像是数组,但是不能直接使用数组的方法。

下面是一个示例:

function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6

在这个示例中,我们定义了一个函数 sum,它使用了 arguments 对象来计算所有参数的和。虽然 arguments 看起来像是一个数组,但是它并不是一个真正的数组,因为它没有数组的方法。

Iterable 和 Array Like 对象之间的互操作

Iterable 和 Array Like 对象之间可以相互转换。我们可以使用 Array.from 方法将 Iterable 对象转换为数组,也可以使用扩展运算符(...)将 Iterable 对象展开为数组。同样,我们也可以使用 Array.from 方法将 Array Like 对象转换为数组。

下面是一个示例:

// 将 Iterable 对象转换为数组
const arr1 = Array.from(new Set([1, 2, 3]));
const arr2 = [...new Set([1, 2, 3])];

console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2, 3]

// 将 Array Like 对象转换为数组
function toArray() {
  return Array.from(arguments);
}

console.log(toArray(1, 2, 3)); // [1, 2, 3]

在这个示例中,我们首先使用 Set 数据结构创建了一个 Iterable 对象,然后使用 Array.from 方法和扩展运算符将它们转换为数组。接着,我们定义了一个函数 toArray,它使用了 arguments 对象,并将其转换为数组。

总结

在本文中,我们介绍了 Iterable 和 Array Like 对象之间的互操作。Iterable 是一种新的数据类型,表示可以被迭代的对象。Array Like 对象是指那些具有 length 属性,但是没有数组的一些方法的对象。我们可以使用 Array.from 方法将 Iterable 对象转换为数组,也可以使用扩展运算符将 Iterable 对象展开为数组。同样,我们也可以使用 Array.from 方法将 Array Like 对象转换为数组。

学习和掌握 Iterable 和 Array Like 对象之间的互操作,可以帮助我们更好地处理各种数据结构,提高开发效率。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65882113eb4cecbf2dd502c8


纠错
反馈