JavaScript學習-ES6-Set物件與weakSet
Set物件是值的集合,你可以按照插入的順序迭代它的元素。 Set中的元素只會出現一次,即 Set 中的元素是唯一的。
NaN和undefined都可以被儲存在Set 中, NaN之間被視為相同的值(儘管 NaN !== NaN)。
建立一個Set物件語法:
new Set([iterable]);
iterable如果傳遞一個可迭代物件,它的所有元素將被新增到新的 Set中。如果不指定此引數或其值為null,則新的 Set為空。
屬性:
Set.length、get Set建構函式用來建立物件、Set.prototype表示Set構造器的原型,允許向所有Set物件新增新的屬性。例項:
所有Set例項繼承自 Set.prototype。
兩屬性:Set.prototype.constructor(例項的建構函式)和Set.prototype.size(值的個數)
方法:
Set.prototype.add(value); 在Set物件尾部新增一個元素。返回該Set物件。
Set.prototype.clear(); 移除Set物件內的所有元素
Set.prototype.delete(value) 移除Set中與value相等的元素
Set.prototype.entries() 返回一個新的迭代器物件,該物件包含Set物件中的按插入順序排列的所有元素的值得陣列,為了和Map物件保持相似,鍵值相等
Set.prototype.forEach(callbackFn(){...}) 按照插入順序,為Set物件中的每一個值呼叫一次callBackFn。如果提供了thisArg引數,回撥中的this會是這個引數。
Set.prototype.has(value) 返回一個布林值,表示該值在Set中存在與否。
Set.prototype.values() 返回一個新的迭代器物件,該物件包含Set物件中的按插入順序排列的所有元素的值。
Set.prototype.keys() 與values()方法相同,返回一個新的迭代器物件,該物件包含Set物件中的按插入順序排列的所有元素的值。
Set.prototype[@@iterator]() 返回一個新的迭代器物件,該物件包含Set物件中的按插入順序排列的所有元素的值。
//new個物件
let mySet = new Set();
//新增數字、str、布林
mySet.add(123);
mySet.add("你好");
mySet.add(456);
mySet.add(true);
//再來一個引用型別
var o = {
a : 1,
b : 2
};
mySet.add(o);
//前面的指向和此處不同,所以可以新增
mySet.add({a:1,b:2});
// console.log(mySet);
// console.log(mySet.length);//undefined
// console.log(mySet.size);
// //has()判斷
// console.log(mySet.has("你好"));
// console.log(mySet.has(123));
// console.log(mySet.has("你好啊"));
// //刪除“你好”
// if(mySet.delete("你好")){
// console.log("刪除成功");
// }
// console.log(mySet);
//
// //返回一個與map物件相似的鍵值相等的資料結構
// console.log(mySet.entries());
// console.log(mySet.keys());//這兄弟兩個有毛用?
// console.log(mySet.values());//感覺一樣哦
//迭代set
//迭代1
// for(let i of mySet){
// console.log(i);
// }
//迭代2
// for (let i of mySet.keys()) console.log(i);
// for (let item of mySet.values()) console.log(item);
//迭代3
// for (let [key, value] of mySet.entries()) console.log(key,value);
//迭代4
// mySet.forEach(function (value) {
// console.log(value);
// });
//轉set為array
// var arr = Array.from(mySet);
// console.log(arr);
// let myArray = ["value1", "value2", "value3"];
// 用Set構造器將Array轉換為Set,new Set(array);
// let mySet2 = new Set(myArray);
// mySet.has("value1"); // returns true
// 用...(展開操作符)操作符將Set轉換為Array
// console.log([...mySet2]); // 與myArray完全一致
// 如果在HTML文件中工作,也可以:這個是幹啥玩意用的
// mySet.add(document.body);
// mySet.has(document.querySelector("body")); // true
//交叉元素
// let set2 = new Set([123,11,1111,456]);
// let intersection = new Set([...mySet].filter(x => set2.has(x)));
// console.log(intersection);
//String,會拆分哦
// let text = 'Indiana';
// let mySet3 = new Set(text); // Set {'I', 'n', 'd', 'i', 'a'}
// console.log(mySet3.size); // 5
weakSet物件和Set的區別:
WeakSet
物件中只能存放物件引用, 不能存放值, 而Set
物件都可以.WeakSet
物件中儲存的物件值都是被弱引用的, 如果沒有其他的變數或屬性引用這個物件值, 則這個物件值會被當成垃圾回收掉. 正因為這樣,WeakSet
物件是無法被列舉的, 沒有辦法拿到它包含的所有元素