setjavascript
聲明html
let set = new Set();即建立了一個空的setjava
賦值數組
let set = new Set(['張三','李四','王五']);函數
特性spa
似於數組,但它的一大特性就是全部元素都是惟一的,沒有重複。code
咱們能夠利用這一惟一特性進行數組的去重工做。htm
let set = new Set([1, 2, 2, 3, 4, 3, 5]) console.log(set) //Set(5) {1, 2, 3, 4, 5} let arr1 = [1, 2, 3, 4] let arr2 = [2, 3, 4, 5, 6] let set2 = new Set([...arr1,...arr2]) //...是set轉數組 後面有詳細的 console.log(set2)//Set(6) {1, 2, 3, 4, 5,6}
記住一個屬性和4個方法對象
屬性blog
set.size 長度
方法
add 增長 console.log(set.add('劉德華').add('旋之華')); delete 刪除 console.log(set.delete('張三')); console.log(set.delete('李四')); console.log(set); has 檢測是否含有 返回true和false console.log(set.has('張三')); console.log(set.has('張三1')); clear 清楚所有 沒有返回值 console.log(set.clear()); // undefined console.log(set);
ste和array互轉
數組轉set let set = new Set(new Array(7, 8, 9)) console.log(set) // Set(3) {7, 8, 9 set轉數組 let set4 = new Set([4, 5, 6]) console.log('方式一:', [...set4]) //方式一: (3) [4, 5, 6] console.log('方式二:', Array.from(set4)) //方式二: (3) [4, 5, 6]
遍歷
可使用Set實例對象的keys(),values(),entries()方法進行遍歷。
因爲Set的鍵名和鍵值是同一個值,它的每個元素的key和value是相同的,全部keys()和values()的返回值是相同的,entries()返回的元素中的key和value是相同的。
let set5 = new Set([4, 5, 'hello'])
console.log(' useing Set.keys()')
for(let item of set5.keys()) {
console.log(item)
}
console.log(' useing Set.values()')
for(let item of set5.values()) {
console.log(item)
}
console.log(' useing Set.entries()')
for(let item of set5.entries()) {
console.log(item)
}
結果
useing Set.keys()
5
hello
useing Set.values()
5
hello
useing Set.entries()
[ 4, 4 ]
[ 5, 5 ]
[ 'hello', 'hello' ]
map 和set大同小異
1. 建立一個Map
let obj1 = {a: 1}, obj2 = {b: 2}; const map = new Map([ ['name', '張三'], ['age', 18], ['sex', '男'], [obj1, '今每天氣很好'], [obj2, '適合敲代碼'], [[1,2], 'hhh'] ]); console.log(map);
console.log(map.size);
方法
set和get
map.set('friends', ['趙六', '力氣']).set(['dog'], '小花'); console.log(map); console.log(map.get('name')); console.log(map.get(obj1));
delete has clear
和set同樣
// delete map.delete(obj1); // 刪除指定的元素 console.log(map.delete('xxxx')); console.log(map); // has console.log(map.has(obj1)); //有就返回true console.log(map.has(obj2)); //沒有就返回false // clear map.clear(); //清空整個map console.log(map);
keys() values() entries()
let obj1 = {a: 1}, obj2 = {b: 2}; const map = new Map([ ['name', '張三'], ['age', 18], ['sex', '男'], [obj1, '今每天氣很好'], [obj2, '適合敲代碼'], [[1,2], 'hhh'] ]); map.forEach(function (value, index) { console.log(index + ':' + value); })
遍歷
let obj1 = {a: 1}, obj2 = {b: 2}; const map = new Map([ ['name', '張三'], ['age', 18], ['sex', '男'], [obj1, '今每天氣很好'], [obj2, '適合敲代碼'], [[1,2], 'hhh'] ]);
map.forEach(function (value, index) {
console.log(index + ':' + value);
})
//打印結果
name:張三
age:18
75 sex:男
[object Object]:今每天氣很好
5 [object Object]:適合敲代碼
1,2:hhh
注意事項
map.set({}, '呵呵呵呵呵'); map.set({}, '哈哈哈哈'); console.log({} === {}); //打印結果false
對象是引用類型,他們在堆區存放的地址是不同的 因此不全等!! 既然都作到這裏了 那就來全面的複習複習 引用數據類型和基本數據類型的區別和堆棧的概念吧!!
symbol
Symbol
是由ES6規範引入的一項新特性,它的功能相似於一種標識惟一性的ID。一般狀況下,咱們能夠經過調用Symbol()
函數來建立一個Symbol實例:
let s1 = Symbol()
或者,你也能夠在調用Symbol()
函數時傳入一個可選的字符串參數,至關於給你建立的Symbol實例一個描述信息:
let s2 = Symbol('another symbol')
因爲Symbol
是一種基礎數據類型,因此當咱們使用typeof
去檢查它的類型的時候,它會返回一個屬於本身的類型symbol
,而不是什麼string
、object
之類的:
typeof s1 // 'symbol'
每一個Symbol實例都是惟一的。所以,當你比較兩個Symbol實例的時候,將總會返回false
:
let s1 = Symbol() let s2 = Symbol('another symbol') let s3 = Symbol('another symbol') s1 === s2 // false s2 === s3 // false
用法
最大的用法是用來定義對象的惟一屬性名。
因爲每個 Symbol 的值都是不相等的,因此 Symbol 做爲對象的屬性名,能夠保證屬性不重名。
let sy = Symbol("key1"); // 寫法1 let syObject = {}; syObject[sy] = "kk"; console.log(syObject); // {Symbol(key1): "kk"} // 寫法2 let syObject = { [sy]: "kk" }; console.log(syObject); // {Symbol(key1): "kk"}
const obj = {}; obj.name = '張三'; obj.name = '李四'; obj[Symbol('name')] = '張三'; obj[Symbol('name')] = '李四'; console.log(obj); //name: "李四"Symbol(name): "張三"Symbol(name): "李四" 對象設置相同name會覆蓋,而symbol不會