这个也是自己以前在项目中犯得一个低级错误,但是对理解for循环还是很有帮助的,可以作为初级前端的面试题(啊,我果然还是一个前端菜鸡=。=) 如题:me.deviceTableHead是一个数组,现要遍历该数组,将数组中属性isSimple为false的项剔除掉。请写出相关的for循环。 好吧,作为一个菜鸡,我当时,没经过思考直接就这样写的: for (var i = 0; i < me.deviceTableHead.length;i++ ) { if (me.deviceTableHead[i].isSimple === false) { me.deviceTableHead.splice(i, 1); } } 各位同学发现问题所在了吗? 好的,有同学发现了这个length是变化的,它会逐渐变小。嗯,这是一个问题,但它却不是造成错误的原因。造成错误的真正原因是后面的i++。举个栗子:假如这个数组为arr=[a,b,c,d,e,f]。当i=1时,发现arr[1]不合要求,将b剔除掉,此时数组变成[a,c,d,e,f]。然后i++,i=2时,这时arr[2]=d.很显然,此时把c跳过了,而没有去检查它。这时该怎么做呢?就是当arr[i]不符合规定,剔除时,不进行i++。这样就不会造成跳过的情况发生。只有当arr[i]符合规定时,再进行i++。正确写法如下: for (var i = 0; i < me.deviceTableHead.length; ) { if (me.deviceTableHead[i].isSimple === false) { me.deviceTableHead.splice(i, 1); } else { i++; } } 如果真正理解了for的遍历顺序,其实这题还是很简单的(我还是太菜了=。=)
最新评论