for…of陳述句在可迭代物件上執行遍歷,在 每次遍歷中,將不同屬性的值( Map是鍵值 對)分配給變數,
可迭代物件是具有Iterator介面,即含有 [SymboLiterator]屬性的資料型別:包括 Array, Map, Set, String, arguments, TypedArray(二進制相關陣列)等,
//遍歷array,array的黑犬認[SymboLiterator]是array的values,方法,回傳array每項的值的迭代器,
let arr = [1,2,3];
for (let val of arr) {
console.log(val);
}
//123
//遍歷arguments
function sum() {
let sum = 0
for(let num of arguments){
sum += num
}
console.log(sum); //15
}
sum(1,2,3,4,5)
//遍歷Map, Map的默認[Symbol.iterator]是Map的entries()方法,回傳Map鍵值對迭代器,
var map = new Map()
map.set('a', 'A')
map.set('b', 'B')
map.set('c', 'C')
for(var n of map){
console.log(n)
}
// ['a','A']
// ['b','B']
// ['c','C']
for (let [key, val] of map) {
console.log(val);
}
// 'A''B'C'
//遍歷 Set,Set的黑犬認[Symbol.iterator]是Set的values,方法,回傳Set值迭代器,
let set = new Set([1,1,2,2,3,3]);
for (let val of set) {
console.log(val);
}
//1 2 3
//遍歷由生成器創建的迭代器(iterator)
function *gen(){
yield 1;
yield 2;
yield 3;
}
let iterl = gen();
for (let letter of iterl) {
console.log(letter);
}
//1 2 3
let arr =['a','b','c'];
let iter2 = arr[Symbol.iterator]();
for (let letter of iter2) {
console.log(letter);
}
// a b c
使用 break、continues return 和 throw 終止回圈執行:
const iterable = ['a','b','c'];
for (const value of iterable) {
console.log(value);
break;
}
//a (只有a被列印出來)
普通物件非可迭代物件,無法使用for of遍 歷 , 如需使用可添加一個[SymboLiterator]屬性,并指向一個迭代器生成函式(生成器,或任何可以回傳一個 迭代器的函式)即可,
let obj = {
"0": "aa",
"2": "cc"
}
obj[ Symbol.iterator ] = function *(){
for( let key in this){
let val = this[key];
yield val;
}
}
for( let i of obj){
console.log(i)
}
//aa
//bb
// cc
如果是偽陣列物件(含索引數屬性和length屬性)還可直接借用陣列的,obj[Symbol.iterator] = [] [Symbol.iterator]
或者使用 Object.keys和Object.entries轉 化成陣列后再用for of
const obj = {
a: 1,
b: 2,
c: 3
}
// Object.keys(obj)輸出["a", "b", "c"]
for (var key of Object.keys(obj)) {
console.log(key + ':'+ obj[key])
}
//a: 1
//b:2
//c:3
// Object.entries(obj)輸出[["a", 1],["c",3]]
for (let [key, value] of Object.entries(obj)) {
console.log(key,value)
}
//a-1
//b-2
//c-3
for of遍歷原理:
//先呼叫可迭代物件iterable內部的Symbol.iterator方法來獲取迭代器iterator,然后回圈每執行一次都會呼叫迭代器的next,方法,并將迭代器回傳的結果物件中的value性存盤在一個變數中,這樣不斷回圈直到回傳
物件的done屬性的值為true,for of實際遍歷的是迭代器,
var iterator = iterable[Symbol.iterator]();
for(;;){
var result = iterator.next();
if (result.done) break;
var item = result.value;
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/298679.html
標籤:其他
