知识卡片

数组枚举要避坑

普通读书笔记卡 · 1494.b

内容

数组本质是对象,for in 可遍历它的所有属性,但不保证顺序,而遍历数组通常需要按数字顺序,还有从原型链带出意外属性的风险。更稳妥做法是用常规 for 循环按下标遍历(或 for of/数组方法),既保证顺序也不牵扯原型链。关联:[[反射需防原型]];发散:遍历方式须匹配数据结构语义,”键控集合”和”有序序列”的遍历工具搞反是常见错误来源。

参考来源

- 位置:《JavaScript语言精粹(修订版)》第6章《数组 Arrays》"枚举"一节 - 结论依据:原文指出"for in无法保证属性的顺序,而大多数要遍历数组的场合都期望按照阿拉伯数字顺序来产生元素。此外,可能从原型链中得到意外属性的问题依旧存在",并推荐用常规 for 语句代替,据此推出数组遍历应避免 for in、改用下标循环的结论。 - 原始内容:因为JavaScript的数组其实就是对象,所以for in语句可以用来遍历一个数组的所有属性。遗憾的是,for in无法保证属性的顺序……幸运的是,常规的for语句可以避免这些问题。