JavaScript 中的内置可迭代对象是那些实现了迭代器接口的对象,这个接口由一个
@@iterator
方法定义,此方法返回一个包含
next
方法的对象,当调用
next
方法时,它返回一个具有两个属性
{value, done}
的对象,其中
value
是序列中的下一个值,
done
是一个布尔值,如果迭代完成则为
true
,否则为
false
。,以下是一些内置的可迭代对象:,
,1、
数组(Array),数组是最基本的可迭代对象之一,可以使用
for...of
循环或者
Array.prototype.entries()
、
Array.prototype.values()
等迭代方法来遍历数组。,2、
字符串(String),字符串也是可迭代的,在遍历字符串时,每次迭代会得到字符串中的一个字符。,3、
Map 和 Set,这两种数据结构都实现了
@@iterator
方法,并且可以通过
for...of
循环进行遍历,对于
Map
,迭代会返回键值对的数组,而对于
Set
,则只返回其值。,4、
TypedArray,包括
Int8Array
、
Uint8Array
、
Uint8ClampedArray
、
Int16Array
、
Uint16Array
、
Int32Array
、
Uint32Array
、
Float32Array
和
Float64Array
,这些视图提供了在内存中操作原始二进制数据的方法,并实现了可迭代接口。,5、
Generator 函数,当创建一个生成器函数并调用它时,它不会立即执行,而是返回一个特殊的迭代器,称为生成器,通过调用生成器的
next
方法可以产生一系列的值。,
,6、
NodeList 和 HTMLCollection,在浏览器环境中,像
document.querySelectorAll
返回的
NodeList
或类似
window.open
返回的
HTMLCollection
这样的类数组对象也是可迭代的。,7、
arguments 对象,函数的
arguments
对象也具有迭代接口,尽管它不是一个真正的数组,但它可以被当作一个数组来遍历。,除了以上提到的内置可迭代对象,开发者也可以通过自定义对象的
Symbol.iterator
方法来创建自己的可迭代对象。,自定义可迭代对象,要使自定义对象成为可迭代对象,你需要在其原型上定义一个使用
Symbol.iterator
符号的方法。,在这个例子中,我们定义了一个名为
myIterable
的对象,并在其上实现了一个生成器函数作为迭代器,这使得我们可以使用
for...of
循环来遍历该对象。,相关问题与解答,Q1: 如何判断一个对象是否是可迭代的?,
,A1: 你可以使用
typeof
运算符来检查对象是否具有
[Symbol.iterator]
方法:,Q2: 我能否在非内置对象上使用for...of
循环吗?,A2: 可以,只要你的对象实现了迭代器接口(即具有
[Symbol.iterator]
方法),你就可以使用
for...of
循环来遍历它。,Q3: JavaScript 中的哪些对象不是可迭代的?,A3: 大多数原生对象类型如数字、布尔值、
null
、
undefined
以及普通对象都不是可迭代的,除非它们明确地实现了迭代器接口。,Q4: 如果我自己定义了一个可迭代对象,我该如何中断迭代?,A4: 在自定义迭代器中,你可以通过抛出一个异常来中断迭代过程,当异常被抛出时,
for...of
循环将停止执行。,