什么是迭代器?
一種機制,也是一種接口,為數據結構提供統一訪問接口,依次處理數據據結構成員?
? 只要實現了迭代器接口,就可以使用for...of循環遍歷。
/*** 迭代器是一種機制 是一種接口 只要數據解構實現了接口 就可以使用for ...of遍歷*/
// 遍歷字符串 str = 'hello'
/*** 1.for 循環* 2.for in循環 * 3.split('')* 4.Array.from()* 5.Array.prototype.slice.call(str,0)* 6.[...res] = str;* 7.for of循環遍歷字符串*/
let str = 'hello';
for(let key of str){console.log(key);
}for(let i=0;i<str.length;i++){console.log(i,str[i])
}
for(let key in str){console.log(key,str[key]);
}
? 迭代器本質就是迭代器對象調用next方法,迭代對象理解為指針對象,指針指向數據結構成員
? 第一次調用指向第一個成員 依次調用指向后面成員 。
let arr = ['terry','larry','ronda','jacky','briup'];
let keys = arr.keys();//返回值是迭代器對象 實現了迭代器接口 for ...of遍歷
let values = arr.values();
let entries = arr.entries();
console.log(keys,values,entries);
// console.log(keys);
/*** 迭代器本質就是迭代器對象調用得next方法 迭代器對象創建一個指針 指向數據結構首位成員位置* 第一次調用指向第一個成員 依次調用依次指向后面成員*/
console.log(keys.next());//{ value: 0, done: false }
console.log(keys.next());//{ value: 1, done: false }
console.log(keys.next());//{ value: 2, done: false }
console.log(keys.next());//{ value: 3, done: false }
console.log(keys.next());//{ value: 4, done: false }
let result;
while(!(result=keys.next()).done){console.log(result)
}
for(let key of keys){console.log(key);
}
for(let value of values){console.log(value);
}
for(let entry of entries){console.log(entry);
}
console.log(values.next());
console.log(entries.next());function foo(){for(let key of arguments){console.log(key);}
}
foo(1,2,3,4)
let arr1 = [1,2,3,4];
for(let key of arr1){console.log(key,'222');
}
let obj = {name:'zhangsan',age:12,gender:'male'
}
for(let key of obj){console.log(key,'333');
}
set集合?
? 類似于數組,特點內部成員不會重復,Set構造函數創建set集合,接收參數實現了迭代器接口數據結構
? ????????key和value一致
? 1.添加成員
? set.add('hello')
? set.add(10)
? set.add(null);
? set.add('hello');//不會被添加?
? set.add([]);
? set.add([]);//會被依次添加
? 2.刪除成員?
? set.delete('hello');
? set.delete(arr);
? 3.清空成員
? set.clear();
? 4.遍歷成員?
? set.forEach((key,value)=>{
? })
? 5.keys ?獲取key值組成數組
? ? values 獲取value值組成數組
? ? entries 獲取key value組成數組
? 6.獲取成員個數?
? set.size?
? 7.檢測set有沒有次成員?
? set.has('hello');
? 可以用set來進行數組去重復?
/*** set 類似于數組 使用Set構造函數創建 key和value是一致得* 特點:成員的值都是唯一得 參數:數組或者實現了迭代器接口對象*/
// let set = new Set([1,2,3,4,3,2,1]);
// let set1 = new Set('hello');
// // let set2 = new Set({name:'zhangsan'});報錯
// console.log(set,set1);
let set = new Set();
// 添加成員 add
set.add('hello');
set.add(10);
set.add('hello');
let arr = [];
set.add(arr);
set.add([]);
// console.log(set);
// 刪除成員 delete
// console.log(set.delete('hello'));
// console.log(set.delete(arr));
// console.log(set);// keys values entries
// console.log(set.keys());
// console.log(set.values());
// console.log(set.entries());
// for(let key of set.keys()){
// console.log(key);
// }// forEach 遍歷set集合
// set.forEach((key,value)=>{
// console.log(key,value)
// })// 返回set成員個數
// console.log(set.size,'返回成員個數');
// 判斷set集合中有沒有這個成員
// console.log(set.has(null))
// 清空set成員
// set.clear();
// console.log(set)// set應用 數組去重
let set1 = new Set([1,2,3,4,5,4,3,2,1]);
console.log(Array.from(set1));
console.log([...set1])
map集合?
? 類似于對象,也是鍵值對形式得數據結構,鍵可以是任意數據類型,實現了迭代器接口?
? let map = new Map();//接收參數數組 鍵值對組成數組
? 1.添加鍵值對?
? map.set(funtion(){},null);
? map.set(1,1);
? 2.刪除一個屬性
? map.delete(1)
? 3.keys values entries?
? keys返回得是鍵迭代器對象
? values返回的是值迭代器對象
? entries返回得鍵值對迭代器對象
? 4.forEach
? map.forEach((value,key)=>{
? })
? 5.size?
? map.size 獲取鍵值對個數
? 6.獲取屬性?
? map.get(鍵)
/*** 對象鍵只能是string類型和symbol類型* Map類似于對象 */
// let obj = {
// name:'zhangsan',
// null:'hello',
// [Symbol('email')]:'xxxx.com'
// }
let obj = {name:'zhangsan',age:12
}
// console.log(Object.entries(obj));
let map = new Map(Object.entries(obj));
// 添加成員 set
map.set({name:'map'},'hello');
let foo = function(){}
map.set(foo,null);
// console.log(map);// 刪除成員
// map.delete('name');
// map.delete(foo);
// console.log(map);// 獲取成員鍵所對應的值
console.log(map.get('age'));
console.log(map.get(foo));console.log(map.size);//獲取成員個數 console.log(map.keys());//獲取鍵組成迭代器對象
console.log(map.values());//獲取值組成迭代器對象
console.log(map.entries());//獲取鍵和值組成迭代器對象// 遍歷map
map.forEach((value,key)=>{console.log(value,key)
})
console.log(Map.prototype.get,Set.prototype);
對象和map區別?
1.對象鍵只能是symbol值或者字符串,map鍵可以是任意數據類型
2.map屬性是有序得,按照插入鍵得順序依次返回,對象屬性無序的,但是也保留字符串或symbol值得插入順序
3.map鍵值對個數可以通過size獲取,對象鍵值對個數只能手動計算
4.map實現了迭代器接口,可以直接使用for...of遍歷,對象沒有實現迭代器接口,無法直接for..of遍歷但是對象可以調用keys,values,entries得到數組進行遍歷
5.都是引用數據類型,都有原型對象