ES6 中 Set集合的使用


        /**
         * 全局作用域绑定
         * let 和 const 和 var 的另一个区别是它们在全局作用域的行为。 当var被作用于全局作用域时,浏览器环境中的
         * window对象的属性。 这意味着用var很可能会无意覆盖一个已经存在的全局属性
         * */
       /*  var RegExp = "Hello";
         console.log(window.RegExp);

         var ncz = "Hi!";
         console.log(window.ncz);*/

        /**
         * ECMAScript6中的Set集合
         * Set集合时一种有序列表,其中含有一些相互独立的非重复值,可以通过Set集合快速访问其中的元素
         *
         * 在set集合中不会对值进行强制的类型转换,数字 5和字符串"5"可以作为两个独立的元素存在
         */
        let set = new Set();
        set.add(5);
        set.add("5");
        console.log(set.size);  // size : 2

        let key1 = {}, key2 = {};

        set.add(key1);
        set.add(key2);
        // 由于key1和key2不会被转换为字符串,所有在set集合中是独立存在的元素
        console.log(set.size);  // size : 4

        // 重复添加会被忽略
        set.add(5);
        console.log(set.size); // size : 4

        let numArray = [1,2,2,3,4,5,5,5];
        let arraySet = new Set(numArray);
        console.log(arraySet.size); // size: 5 ====> 1,2,3,4,5


        // Set集合是否存在
        let numSet = new Set();
        numSet.add(5);
        numSet.add(6);

        console.log(numSet.has(5));  // true
        console.log(numSet.has(10)); // false

        // Set集合移除元素
        numSet.delete(5);
        console.log(numSet.has(5));  // false

        // Set集合清空
        numSet.add(5);
        numSet.clear();
        console.log(numSet.size); // size: 0

        // Set集合forEach
        numSet.add("javaScript");
        numSet.add("java");
        numSet.add("python");

        numSet.forEach(function(value, key, ownerSet){
            console.log(key + " >> " + value); // 输出的键值一样
            console.log(ownerSet ===  numSet); // true
        });

        // 将Set集合转换为数组
        set = new Set([1,2,3,3,3,4,5]);
        let paramArray = [...set];
        console.log(typeof paramArray); // object
        console.log(paramArray);

        /**
         * Weak Set集合
         * 将对象存储在Set集合中与存储在变量中是完全一样的,垃圾回收机制就不能释放该对象的内存空间
         */
        let objectKey = new Set();
        let person = {
            name : "song",
            age : 10
        }
        objectKey.add(person);

        // 移除原始索引
        person = null;
        console.log(objectKey.size); // size : 1

        // 重新取回原始引用
        person = [...objectKey][0];
        console.log([...objectKey][0].name + " >>> " + [...objectKey][0].age);
        // 为了解决这个问题,ECMAScript6 引入了WeakSet集合 支持3个方法 add() delete() has()

        let weak = new WeakSet();
        // 可以向集合中添加引用
        weak.add(person);
        // 判断是否有指定对象的引用
        console.log(weak.has(person));
        // 删除引用
        weak.delete(person);

        // WeakSet与Set类型的区别, WeakSet保存对象的引用
        weak.add(person);
        weak.has(person); //  true
        person = null;    //  此时weakSet已经移除了弱引用了


        /**
         * WeakSet集合与普通Set集合的差别
         *
         * 1. add() 如果传入非对象参数,会报错
         * 2. weakSet 不可以迭代,不能 for-of
         * 3. weakSet集合不支持forEach方法
         * 4. weakSet集合不支持size
         * 如果你只需要跟踪对象的引用,应该使用WeakSet集合
         * */

        // for-of 可以遍历数组和对象
        let numStr = ["a","b","c"];
        for (let i of numStr) {
            console.log(i); // a b c
        }

猜你喜欢

转载自blog.csdn.net/qq_34579060/article/details/91413311
今日推荐