JS中的forEach,for in,for of和for的遍历优缺点及区别

JavaScript07

JS中的forEach,for in,for of和for的遍历优缺点及区别,第1张

优点: 遍历的时候更加简洁,效率和for循环相同,不用关心集合下标的问题,减少出错的效率

缺点: 不能同时遍历多个集合,在遍历的时候无法修改和删除集合数据,方法不能使用break,continue语句跳出循环,或者使用return从函数体返回,对于空数组不会执行回调函数

forEach不可遍历对象,这也是和for in的区别

优点: 可以遍历数组的键名,遍历对象简洁方便

缺点: 某些情况下,会出现随机顺序的遍历,因为里面的值是string类型,所以增加了转换过程,因此开销比较大

优点: 避免了for in的所有缺点,可以使用break,continue和return,不仅支持数组的遍历,还可以遍历类似数组的对象,支持字符串的遍历,最直接的遍历数组的语法,支持map和set对象遍历

缺点: 不适用于处理原有的原生对象

优点: 程序简洁,结构清晰,循环初始化,循环变量化,循环体和循环条件位置突出

缺点: 结构比while循环复杂,容易出编码错误

for in循环中每次循环都会将对象的key赋值

例如for (key in obj),每次遍历key都会被赋值成对象obj的一个键名,{a:1,b:2}遍历过程key依次为a和b对于数组,key取得是数组下标

所以你这里遍历的是个数组,i的值分别是数组的下标,用for in遍历数组可能会由于数组增加可枚举的成员而变得不准确

你可以试一下在你的代码前加上

Array.prototype.a = 123

再运行看下结果就有问题了,不要用for in 遍历数组用forEach

1.原型链:

当前对象a=new A()的原型(._proto_)是当前构造函数A.prototype.

A.prototype又可能是另一个构造函数B的实例(new B()).

new B()._proto_是当前构造函数B.prototype又可能是构造函数C的实例.

如此向上找形成原型链.

2 for..in

可以遍历可枚举属性(自有属性和继承属性).

所谓继承属性就和原型链息息相关.

如上a继承了构造函数A.prototype里的方法和属性.

A.prototype又继承了B.prototype的方法和属性.

B.prototype又继承了C.prototype的方法和属性.如此往复.

3.例子

function A(){ this.a="a" }

function B(){ this.b="b" }

B.prototype=new A()

var a=new B()

for(var k in a){ console.log("属性"+k+": 值"+a[k]) }

4.控制台