为什么arr.keys()打印显示空对象/undefined却仍可正常遍历?
原因解释
arr.keys() 返回的是数组迭代器对象(Array Iterator),出现你描述的现象完全是迭代器的惰性求值特性和控制台的展示逻辑共同导致的:
- 迭代器默认采用惰性求值设计,本身不会预先存储所有待返回的索引值,只有当主动调用它的
next()方法时才会动态计算生成下一个要返回的值。多数运行环境的控制台打印迭代器时,不会主动触发next()调用枚举其内部所有值,因此会展示为空对象,部分旧版本环境甚至会错误显示为undefined,这只是控制台的展示偏差,不是迭代器真的没有内容。 for...of遍历内部会自动识别实现了可迭代协议的对象,循环过程中会反复调用迭代器的next()方法获取值,直到返回的done属性为true时终止循环,因此可以依次输出0、1、2三个索引值。
验证方法
你可以手动调用迭代器的next()方法验证它的行为:
let arr = [1, 2, 4] let key = arr.keys(); // 手动调用next查看每一次返回结果 console.log(key.next()); // 输出 {value: 0, done: false} console.log(key.next()); // 输出 {value: 1, done: false} console.log(key.next()); // 输出 {value: 2, done: false} console.log(key.next()); // 输出 {value: undefined, done: true},迭代结束
内容的提问来源于stack exchange,提问作者AKASH MAURYA
相关产品推荐
相关产品推荐

