ES6新数据类型map

set和数组比较类似,而map和对象比较类似

和对象的区别 对象的键只能是字符串,而map则突破了这个界限,各种类型的值(包括对象)都可以作为键,是一种更加完善的hash结构的实现
下面是对于对象的演示

//创建两个对象
let obj1 = {a:1};
let obj2 = {b:2,c:3};
//打印对象
console.log(obj1);
//通过.操作符进行访问
console.log(obj1.a);
//直接添加元素
obj2.d = 4;
console.log(obj2);

对象用对象类型作为键的效果

//两个不同的对象
let obj1 = { a: 1 };
let obj2 = { b: 2 };
let obj = {};
//在两次添加元素后控制台显示
obj[obj1] = "obj1";
console.log(obj);      //{[object Object]: "obj1"}
obj[obj2] = "obj2";
console.log(obj);     //{[object Object]: "obj2"}
console.log(obj.obj1); //undefined
console.log(obj.obj2); //undefined

我们可以发现,没有像我们预期的一样,obj1和obj2分别作为键,形成不同的键值对,同时也不能通过以obj1/obj2作为键的方式进行访问

原因: 由于对象中的键只能是字符串,所以在上面的语句obj[obj1] = "obj1"; 的执行过程中,先隐式的调用了类型转换,调用了obj1.toString()

map的声明

我们已经说过,map就是为了解决这种尴尬的情况而生的
map的创建如下

//空map
let map = new Map();
//有内容的map
let map2= new Map([
    ["a",1],
    ["b",2]
]);
console.log(map2); //Map(2) {"a" => 1, "b" => 2}

我们尝试一下使用对象作为键;

let obj1 = { a: 1 };
let obj2 = { b: 2 };
let map = new Map();
let map2= new Map([
    [obj1,"obj1"],
    [obj2,"obj2"],
    [obj1,"test"]
]);
console.log(map2);

打开控制台看一下

Map(2) {{…} => “obj1”, {…} => “obj2”}
已经很清晰的区分开了

map的常用属性和方法

size

还是使用上面的例子,使用下面的语句

console.log(map2.size);  // 2

set和get

set函数用来设置元素,get函数用来获取元素
* set例子

//要注意的是,map的set方法也支持级联调用
map2.set("testSet","test");
console.log(map2);
console.log(map2.size);
  • get例子
console.log(map.geta("testSet")); //test

clear has delete

这三个函数的功能和set中同名的方法基本一致
* clear清空map
* has判断是否有这个元素
* delete删除这个元素
*

keys() values() entries()

我们把一个map调用这个函数的结果打印出来

let map = new Map([
    ["key1","value1"],
    ["key2","value2"],
    ["key3","value3"]
]);
console.log(map.keys());
console.log(map.values());
console.log(map.entries());

我们得到的是三个迭代器,内容分别是所有的键,所有的值,所有的键值对。这样就大大方便我们进行遍历操作

Map的遍历操作

let map = new Map([
    ["key1","value1"],
    ["key2","value2"],
    ["key3","value3"]
]);
map.forEach(function(value,index){
    console.log(index + ":" + value);
});

实际开发的注意事项

let map = new Map();
map.set({},"1");
map.set({},"2");
console.log(map);

我们在控制台可以看到,map中有两个键值对,买又发生覆盖。
这是因为对象作为一个复杂的数据类型,在堆中申请了不同的空间,不能算作是相同的键