7、set數據集合:類似於數組
/*set:是一個集合,類似於數組,與數組的主要區別是沒有重複的元素。主要的作用可以進行去重。
* 重點:一個屬性,四個方法
1、size屬性:返回set數組的長度,類似於lenght
2、四個方法:add,delete,clear,has*/
let set =new Set([1,2,3,4,1]);
console.log(set.size); //4
//添加元素
set.add(7);
console.log(set); // {1, 2, 3, 4, 7}
//刪除數組中的某個元素
set.delete(3);
console.log(set); // {1, 2, 4, 7}
//檢測數組中是否含有某個元素,返回值爲布爾
console.log(set.has(2)); //true
//清空數組
set.clear();
console.log(set) //{}
8、map數據集合:類似於對象
let obj={a:1};
const map = new Map([
['name','java'],
['feel','今天天氣賊好'],
['jieguo','適合看帥哥'],
[obj,'是!']
]);
//{"name" => "java", "feel" => "今天天氣賊好", "jieguo" => "適合看帥哥", {…} => "是!"}
console.log(map);
/*Map與Object的區別
1、Map的size屬性可以直接獲取鍵值對個數
2、兩者都是對應的keys-value鍵值對,
但是Object的keys只能是字符串或者 Symbols,
Map的key可以是任意值,比如數組、對象等*/
/*map方法:
1、size:返回鍵值對長度
2、set:設置鍵值對
3、get:獲取對應的value值
4、delete:刪除對應的鍵值對
5、clear:清空map
6、has:查看是否有對應的鍵值對,返回值爲布爾*/
對應代碼:
console.log(map.size); //4
map.set('shia','怎麼了'); //設置鍵值對
console.log(map.get('shia')); //返回對應的value值
console.log(map.delete('shia'));
console.log(map.has('shia'));
console.log(map.has(obj));
map.clear()
console.log(map);
9、Symbol()方法
1、Symbol()相當於第七種數據類型,ES6中爲了防止衝突,引入了Symbol()。
凡是用Symbol()引用的屬性名都是獨一無二的
總結:獨一無二,防止衝突
let s1 = Symbol();
let s2 = Symbol();
console.log(s1); //Symbol()
console.log(s2); //Symbol()
console.log(s1===s2); //false,驗證獨一無二
let s3 = Symbol('name');
let s4 = Symbol('name');
console.log(s1===s2); //false,驗證獨一無二
//數據類型
console.log(typeof s) //symbol
2、可以用來添加對象的屬性值,但是是唯一的,驗證獨一無二*/
//一般的對象添加的屬性名對應的屬性值只能是一個,重複添加會覆蓋
let obj1={};
obj1.name='ni';
obj1.name='wo';
console.log(obj1); //{name: "wo"}
//利用Symbol()添加的會全部顯示出來,因爲每一個name屬性都是獨一無二的,解決了命名衝突的問題
let obj2={};
obj2[Symbol('name')]='ni';
obj2[Symbol('name')]='wo';
console.log(obj2); //{Symbol(name): "ni", Symbol(name): "wo"}
3、不能使用new關鍵字,否則會報錯。
這是因爲Symbol()是一個原始類型的值,
不是對象不能添加任何屬性
let snew = new Symbol();
console.log(snew); //報錯
4、Symbol()可以將字符串作爲參數,
* 表示對實例對象的描述,主要作用可以針對不同變量進行區分
* 注意:由於其參數的值是對其的描述,所以可能每次返回的值是不同的
let a = Symbol('a');
console.log(a.toString()); //Symbol(a)
let b = Symbol('B');
console.log(b); //Symbol(B)
console.log(a===b); //false
5、Symbol()不能與其他類型的值進行運算,但是可以返回一個Boolean值
let c = Symbol();
console.log(s+'nihao'); //Cannot convert a Symbol value to a string
console.log(s+'2'); //Cannot convert a Symbol value to a string
console.log(Boolean(c)); //true
6、不能被for in循環遍歷
var obj3 = {};
var str1 = Symbol('str1');
var str2 = Symbol('str1');
obj3[a] = '我是劉昊然的女朋友';
obj3[b] = '我承認了';
obj3.c = '媽的,瞞不住了';
obj3.d = '我愛劉昊然';
for( let key in obj3 ){
console.log(key) // c d
}
7、可以通過Object.getOwnPropertySymbols()方法,獲取Symbol()屬性名
console.log(Object.getOwnPropertySymbols(obj3)); //[Symbol(a), Symbol(B)]