set、map&symbol

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)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章