欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6 Map类型

程序员文章站 2022-06-02 17:04:23
...

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

相关标签: 对象 数据