返回

正本清源:彻底弄清JS中的可迭代与类数组对象

前端

可迭代对象

可迭代对象是指可以被迭代(循环)的对象。换句话说,我们可以使用 for...of 循环来遍历它的元素。

const iterable = [1, 2, 3];
for (const element of iterable) {
  console.log(element); // 输出:1 2 3
}

可迭代对象不仅限于数组,它还可以是字符串、Set、Map 等。

const iterable = 'hello';
for (const char of iterable) {
  console.log(char); // 输出:h e l l o
}

const iterable = new Set([1, 2, 3]);
for (const element of iterable) {
  console.log(element); // 输出:1 2 3
}

const iterable = new Map([['a', 1], ['b', 2], ['c', 3]]);
for (const [key, value] of iterable) {
  console.log(key, value); // 输出:a 1 b 2 c 3
}

类数组对象

类数组对象是指拥有类似数组的属性和方法的对象。例如,它们拥有 length 属性和 [] 运算符,可以用来访问元素。

const arrayLike = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3
};

console.log(arrayLike.length); // 输出:3
console.log(arrayLike[0]); // 输出:a

但是,类数组对象并不是真正的数组。它们没有 forEach()map() 等数组方法,也不能直接使用 for...of 循环进行迭代。

如何判断一个对象是否可迭代?

我们可以使用 Symbol.iterator 来判断一个对象是否可迭代。

const isIterable = (obj) => {
  return Symbol.iterator in obj;
};

如果 Symbol.iterator 属性存在于对象上,则该对象是可迭代的。

总结

可迭代对象是指可以被迭代(循环)的对象。类数组对象是指拥有类似数组的属性和方法的对象,但并不是真正的数组。我们可以使用 Symbol.iterator 来判断一个对象是否可迭代。