平時自己在寫一些小栗子的時候,用到的基本上是for循環,因為在學專業課(C,C++,JAVA,...)的時候用的最多的就是for循環,不過for循環的效率也是比較高的。
但是for循環在寫的時候,涉及到length,index這幾個變量,使用起來個人覺得還是有點復雜。
for-in循環
最近自己在復習高程的時候,也看了看for-in循環,這個循環是特別針對遍歷對象屬性的。
ECMAScript對象的屬性沒有順序,因此通過for-in循環輸出的屬性名的順序是不可預測的,所有屬性都會被返回一次,但是返回的順序因瀏覽器不同。
之前如果要迭代的對象的變量值為null或undefined,for-in語句會拋出錯誤。但是ECMAScript5更正了這一行為:對這種情況不再拋出錯誤,而只是不執行循環體。為了保證最大限度的兼容,建議使用for-in循環之前,先檢測確認該對象的值不是null或undefined。
Array的真相
在JavaScript中,所有的東西可可以看作是一個對象,Array也是一個對象,Array的索引就是屬性名。實際上,Array的索引也不是Number類型,而是String類型的。
每個Array也有一個length屬性,導致看起來像是一個數組。但是length這個屬性是不可枚舉的,所以在使用for-in循環遍歷Array時,沒有length。
即使不在Array中添加新的屬性,也不會只輸出數組中的內容。
Array.prototype.father = "xiaoming";
const arr = [1,2,3];
arr.name = "hello world";
let index;
for(index in arr){
console.log("array["+index+"]:"+arr[index]);
}
// array[0]:1
// array[1]:2
// array[2]:3
// array[name]:hello world
// array[father]:xiaoming
for-in循環的每次迭代操作會同時搜索實例或者原型屬性,for-in循環的每次迭代會產生很多開銷。除非明確要迭代一個屬性數量未知的對象,否則應該避免使用for-in循環
forEach循環
forEach循環是js高程上數組的一個方法,還有幾個方法參看其他幾個迭代方法
const arr = [];
arr[0] = "a";
arr[3] = "b";
arr[10] = "c";
arr.name = "Hello world";
arr.forEach((data, index, array) => {
console.log(data, index, array); //這里的index是Number類型,這里並沒有遍歷到name屬性
});
// a 0 (11) ["a", empty × 2, "b", empty × 6, "c", name: "Hello world"]
// b 3 (11) ["a", empty × 2, "b", empty × 6, "c", name: "Hello world"]
// c 10 (11) ["a", empty × 2, "b", empty × 6, "c", name: "Hello world"]
forEach循環不會遍歷原型鏈上的屬性
for-of循環
這個是ES6新增的一個方法,用於解決for-in用來遍歷數組出現的問題。
為什么要引進for-of循環呢?
- forEach不能break和return
- for-in缺點更加明顯,不僅會遍歷數組中的元素,還會遍歷自定義的屬性,甚至把原型鏈上的屬性都被訪問到。而且遍歷數組元素的順序可能是隨機的。
for-of循環可以干什么呢?
- 跟forEach相比,可以正確響應break,continue,return
- for-of循環不僅支持數組,還支持大多數類數組對象,例如DOM nodelist對象
- for-of循環也支持字符串遍歷,將字符串視為一系列的Unicode字符來進行遍歷
- for-of也支持Map和Set(兩者均為ES6中新增的類型)遍歷。
這是最直接、最簡潔的遍歷數組的方法
這個方法避開了for-in循環的所有缺陷
與forEach不同的是,可以使用break,continue,return語句
不僅可以遍歷數組,還可以遍歷類數組對象和其他可迭代對象。
但是需要注意的是for-of不遍歷普通對象,ES6引進的另一個方式也能實現遍歷數組的值,那就是Iterator。
這里我只是簡單總結了一點點,自己也認真看了書上的知識,推薦一篇寫的很好的。https://zhuanlan.zhihu.com/p/23812134?utm_source=tuicool&utm_medium=referral