摘要:也就是說,遍歷器對象本質上,就是一個指針對象。規定,默認的接口部署在數據結構的屬性,或者說,一個數據結構只要具有屬性,就可以認為是可遍歷的屬性本身是一個函數,就是當前數據結構默認的遍歷器生成函數。執行這個函數,就會返回一個遍歷器。
for...in遍歷對象的屬性或數組索引(ES5)
eg1:遍歷數組
var arr=["a","b","c","d"]; for(let index in arr){ console.log(index);// 0 1 2 3 console.log(arr[index]);// a b c d }
eg2:遍歷對象
var obj={ name:"Jin", age:11, [Symbol()]:123, } for(let index in obj){ console.log(index);//name age console.log(obj[index]);//Jin 11 }
eg3:遍歷對象的順序
var obj={ "49":"A", "a":"tt", "5":false, "1":"ss", } for(let index in obj){ console.log(index);//1 5 49 a console.log(obj[index])//ss false A tt }for...in的要點:
for...of可遍歷數組,Set,Map,類數組對象(eg:arguments,DOM NodeList對象,字符串)(ES6)不能遍歷對象
eg1:遍歷數組
var arr=["a","b","c","d"]; for(let key of arr){ console.log(key);// a b c d console.log(arr[key]); //undefined undefined undefined undefined }
eg2:遍歷對象
var obj={ "49":"A", "a":"tt", "5":false, "1":"ss", } for(let key of obj){//報錯 console.log(index); }
eg3:for of與Object.keys()遍歷對象
var obj={ name:"Jin", age:11, } for(let value of Object.keys(obj)){ console.log(value);//name age console.log(obj[value]);//Jin 11 }
eg4:for of與Object.keys()遍歷數組索引
var arr=["a","b","c"]; for(let value of Object.keys(arr)){ console.log(value);//0 1 2 console.log(arr[value]);// a b c }
eg4:for of與Object.entries()遍歷索引和值
var arr=["a","b","c"]; for(let [index,value] of Object.entries(arr)){ console.log(index);//0 1 2 console.log(value);//a b c console.log(arr[index]);//a b c }
eg5:for of與Object.values()遍歷屬性值
var arr=["a","b","c"]; for(let [index,value] of Object.values(arr)){ console.log(index);//a b c console.log(value);//undefined undefined undefined console.log(arr[index]);//undefined undefined undefined }
for...of的要點:
Iterator(遍歷器)與for...of
遍歷器(Iterator) 它是一種接口,為各種不同的數據結構(Array,Object,Set,Map)提供統一的訪問機制。任何數據結構只要部署 Iterator 接口,就可以完成遍歷操作(即依次處理該數據結構的所有成員)。
Iterator 的作用
一是為各種數據結構,提供訪問接口;二是使得數據結構的成員能夠按某種次序排列;三是 ES6 創造了一種新的遍歷命令for...of循環,當使用for...of循環遍歷某種數據結構時,該循環會自動去尋找 Iterator 接口。
Iterator 的遍歷過程
創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。
第一次調用指針對象的next方法,可以將指針指向數據結構的第一個成員。
第二次調用指針對象的next方法,指針就指向數據結構的第二個成員。
不斷調用指針對象的next方法,直到它指向數據結構的結束位置。每一次調用next方法,都會返回數據結構的當前成員的信息。具體來說,就是返回一個包含value和done兩個屬性的對象。其中,value屬性是當前成員的值,done屬性是一個布爾值,表示遍歷是否結束。
ES6 規定,默認的 Iterator 接口部署在數據結構的Symbol.iterator屬性,或者說,一個數據結構只要具有Symbol.iterator屬性,就可以認為是“可遍歷的”Symbol.iterator屬性本身是一個函數,就是當前數據結構默認的遍歷器生成函數。執行這個函數,就會返回一個遍歷器。
原生具備 Iterator 接口的數據結構
Array
Map
Set
String
TypedArray
函數的 arguments 對象
NodeList 對象
對象(Object)之所以沒有默認部署 Iterator 接口,是因為對象的哪個屬性先遍歷,哪個屬性后遍歷是不確定的,需要開發者手動指定。
會默認調用 Iterator 接口場合
解構賦值
擴展運算符
yield*
for...of
Array.from()
Map()
Set()
WeakMap()
WeakSet()(比如new Map([["a",1],["b",2]]))
Promise.all()
Promise.race()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109474.html
摘要:對于,除非使用箭頭函數,它的回調函數的將會變化。使用測試下面的代碼,結果如下打印打印要點使用的規則要求所有回調函數必須使用箭頭函數。 譯者按: JS 騷操作。 原文:For vs forEach() vs for/in vs for/of in JavaScript 譯者: Fundebug 本文采用意譯,版權歸原作者所有 我們有多種方法來遍歷 JavaScript 的數組或者...
摘要:定義兩者都是遍歷的方法,最先能想到的區別是,前者是遍歷鍵名,后者是遍歷鍵值。一種數據結構只要部署了接口,就稱之為可遍歷的。中提供了一些具備原生接口的數據結構包括函數的對象對象。 定義 兩者都是遍歷的方法,最先能想到的區別是,前者是遍歷鍵名,后者是遍歷鍵值。看一下兩者的定義: for...in 遍歷當前對象的所有可枚舉屬性(包括自有屬性,從原型繼承的屬性),遍歷順序是無序的 for.....
摘要:像和使用內置構造函數所創建的對象都會繼承自和的不可枚舉屬性,例如的方法或的方法。循環將遍歷對象本身的所有可枚舉屬性,以及對象從其構造函數原型中繼承的屬性更接近原型鏈中對象的屬性覆蓋原型屬性。遍歷數組時推薦使用,其中為數組每一項的值。 引言 在對數組或對象進行遍歷時,我們經常會使用到兩種方法:for...in 和 for...of,那么這兩種方法之間的區別是什么呢?讓我們來研究研究。 一...
摘要:機器學習深度學習與自然語言處理領域推薦的書籍列表人工智能深度學習與相關書籍課程示例列表是筆者系列的一部分對于其他的資料集錦模型開源工具與框架請參考。 showImg(https://segmentfault.com/img/remote/1460000014946199); DataScienceAI Book Links | 機器學習、深度學習與自然語言處理領域推薦的書籍列表 sho...
閱讀 3542·2021-11-22 15:22
閱讀 3332·2019-08-30 15:54
閱讀 2728·2019-08-30 15:53
閱讀 816·2019-08-29 11:22
閱讀 3537·2019-08-29 11:14
閱讀 2077·2019-08-26 13:46
閱讀 2217·2019-08-26 13:24
閱讀 2280·2019-08-26 12:22