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中有两个键值对,买又发生覆盖。
这是因为对象作为一个复杂的数据类型,在堆中申请了不同的空间,不能算作是相同的键