Open felix-cao opened 5 years ago
$.each = function( obj, callback ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj );
if ( isArray ) { // 迭代类数组
for ( ; i < length; i++ ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) { // 迭代 object 对象
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
}
return obj;
};
上面代码的 value
值可以理解 return false
时, 停止当前循环跳到下一个循环。
循环 (loop) 或者叫遍历 (loop through),还有一种说法叫迭代 (Iterate), 是让计算机做重复任务的有效的方法。循环是所有语言最基础的语法,
跳出循环
JavaScript
中的遍历主要是对“集合”的遍历,JavaScript
原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6
又新增了Map
和Set
。本文重点讨论JavaScript
原有数据“集合”的遍历,即Array
和Object
。Array
提供了一种顺序存储一组元素的功能,并可以按索引来访问。Object
是一个属性和方法的集合,它是无序的,通过属性名或方法名去访问。JavaScript
的循环遍历语法如下:初始条件
、结束条件
和递增条件
来循环执行语句块true
本文主要介绍前 5 个常见的循环语句,此外
ES5
还给我们提供了 map、reduce、filter、some、every 等常见的高阶函数,请移步《JavaScript 高阶函数(Higher-order function) 》, 关于for ...of
,因为是ES6
中新增的语法,回头会在ES6
中讲解。一、for 循环
for
循环,通过初始条件
、结束条件
和递增条件
来循环执行语句块:让我们来分析一下
for
循环的控制条件: 🔢var i=1
这是初始条件,声明变量i
, 并赋值1
;i<=100
这是判断条件,满足时就继续循环,不满足就退出循环;i++
这是每次循环后的递增条件,由于每次循环后变量i
都会加1
,因此它终将在若干次循环后不满足判断条件i<=100
而退出循环。👍
for
循环不能遍历对象,这是因为递增条件
决定着循环对象必须是有序的,而 Array 是有序,Object 是无序的。for
循环最常用的地方是利用索引来遍历数组或类数组:👍
for
循环的 3 个条件都是可以省略的,如果没有退出循环的判断条件,就必须使用break
语句终止循环,否则就是死循环:👍 也可以使用
continue
跳出本次循环,进入下一个循环:二、for ...in 遍历
for
循环的一个变体是for ... in
循环,它可以把一个对象的所有属性依次循环出来:由于
Array
也是对象,其元素的索引被视为对象的属性,因此,for ... in
循环可以直接循环出Array
的索引:请注意,
for ... in
对Array
的循环得到的是String
类型的值而不是Number
。👍 不过,ECMAScript 5.1 (ECMA-262) 给我们提供了更加简洁优雅的提取对象属性的方式:
Object.keys()
三、while 循环
for
循环在明确循环的初始和结束条件时非常有用。而忽略了条件的for
循环容易让人看不清循环的逻辑,这个时候推荐使用while
循环在
while
循环里只要指定条件为true
,循环就可以一直执行代码块。把本篇的第一段演示代码改写如下在循环体内部变量
i
不断自增,直到变为101
时,不再满足while
条件,退出循环。也可以在循环体内使用
break
终止循环或continue
跳出循环。四、do ...while 循环
do { ... } while()
循环,它和while
循环的唯一区别在于,不是在每次循环开始的时候判断条件,而是在每次循环完成的时候判断条件:👍 需要注意的是: 用
do { ... } while()
循环要小心,循环体至少执行1次,而for
和while
循环则可能一次都不执行。五、forEach() 遍历数组
forEach()
方法用于遍历数组的每个元素,并将元素传递给回调函数。例如:
得到:
👍 注意:
forEach()
对于空数组是不会执行回调函数的。👍 跳出本次循环,不能使用
continue
, 而是用return false
上面的代码,遍历数组 arr , 当遇到一个元素的值完全等于字符串
Lucy
即跳出本次循环,进入下一次Bindy
元素的循环。👍 终止循环,使用
try catch
:上面的代码,遍历数组 arr , 当遇到一个元素的值完全等于字符串
Lucy
时抛出一个 error 给 catch 捕捉到, 然后在 catch 里面 return,这样就能中止循环了。