/ es6

ES中内置数据结构 map set

数组array

实例属性和方法:length,push,splice,pop,shift,unshift,join,indexOf,sort
遍历方法:map()、forEach(), for循环, some, filter, every

map

实例属性和方法:size、set、get、has、delete、clear

let map = new Map();
map.set('title','hello world');
map.set('year','2018');

console.log(map.has('year')); //true
map.delete('title');
console.log(map.has('title')); //false
map.clear();
console.log(map.size); //0

遍历方法:keys()、values()、entries()、forEach()

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

// 等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

set

实例属性和方法:size、add、has、delete、clear

let set = new WeakSet();
let key = {};   
set.add(key);
console.log(set.has(key)); //true
set.delete(key);
console.log(set.has(key)); //false

遍历方法:for of ,keys(),values(),entries(),forEach()

let set = new Set(['red', 'green', 'blue']);

for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

有一点注意,初始化set
Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

var p = document.querySelectorAll('div');
//p 可能不是一个数组,只要有iterable 接口 就可以初始化成功
const set = new Set();
set.size // 56

对象

实例属性和方法:assgin
遍历方法:for in
后记
1.Set 是无重复值的有序列表。根据 Object.is()方法来判断其中的值不相等,以保证无重复。 Set 会自动移除重复的值,因此你可以使用它来过滤数组中的重复值并返回结果。 Set并不是数组的子类型,所以你无法随机访问其中的值。但你可以使用has() 方法来判断某个值是否存在于 Set 中,或通过 size 属性来查看其中有多少个值。 Set 类型还拥有forEach()方法,用于处理每个值。
2.Weak Set 是只能包含对象的特殊 Set 。其中的对象使用弱引用来存储,意味着当 Weak Set中的项是某个对象的仅存引用时,它不会屏蔽垃圾回收。由于内存管理的复杂性, Weak Set的内容不能被检查,因此最好将 Weak Set 仅用于追踪需要被归组在一起的对象。
3.Map 是有序的键值对,其中的键允许是任何类型。与 Set 相似,通过调用 Object.is()方法来判断重复的键,这意味着能将数值 5 与字符串 "5" 作为两个相对独立的键。使用set() 方法能将任何类型的值关联到某个键上,并且该值此后能用 get() 方法提取出来。Map 也拥有一个 size 属性与一个 forEach() 方法,让项目访问更容易。
4.Weak Map 是只能包含对象类型的键的特殊 Map 。与 Weak Set 相似,键的对象引用是弱引用,因此当它是某个对象的仅存引用时,也不会屏蔽垃圾回收。当键被回收之后,所关联的值也同时从 Weak Map 中被移除。
5.对于Weak Set和Set之间的重要差异:

对于Weak Set实例,若调用了add()方法时传入了非对象的参数,则会抛出错误。如果在has()或者delete()方法中传入了非对象的参数则会返回false;
Weak Set不可迭代,因此不能用于for-of循环;
Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法) ,因此没有任何编程手段可用于判断 Weak Set 的内容;
Weak Set没有forEach()方法;
Weak Set没有size属性;

6.set使用场景

 // 数组去重
let arr = [1, 1, 2, 3];
let unique = [... new Set(arr)];


let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = [...new Set([...a, ...b])];

// 交集
let intersect = [...new Set([...a].filter(x => b.has(x)))];

// 差集
let difference = Array.from(new Set([...a].filter(x => !b.has(x))));

set的内部实现

function Set(){
            var items = {}
            var length = 0;
            //判断元素是否存在
            this.has = function(val){
                return items.hasOwnProperty(val)
            }
            //增加操作
            this.add = function(val){
                if(!this.has(val)){
                    items[val] = val;
                    length++;
                    return true;
                }
                return false;
            }
            // 删除操作
            this.remove = function(val){
                if(this.has(val)){
                    delete items[val]
                    length-=1;
                    return true;                
                }
                return false;
            }
            // 清除
            this.clear = function(){
                items = {};
                length = 0
                return true
            }
            //获取大小
            this.size = function(){
                return length;
            }
            //获取属性
            this.values = function(){
                return Object.keys(items);
            }
        }    
        var set = new Set()
        set.add(1);set.add(2);set.add(3);set.add('a')