FrankKai / FrankKai.github.io

FE blog
https://frankkai.github.io/
363 stars 39 forks source link

Javascript中的Map类 #155

Open FrankKai opened 5 years ago

FrankKai commented 5 years ago

Map是一个可以体现出javascript不将就态度的数据类型,很多场景下Map比Object更加合适也更加严谨。

学习资料:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

FrankKai commented 5 years ago

Map基本概念

var map = new Map();
map.set(undefined, undefined);
map.set(null, null);
map.set(true, true);
map.set(24, 24);
map.set(BigInt(24), BigInt(24));
map.set('string', 'string');
map.set(Symbol('foo'),Symbol('foo') );
map.set(()=>'function', ()=>'function');
map.set({},{});
map.set([],[]);

image

除Symbol在控制台的输出比较特殊以外,其余都蛮正常。

A symbol value may be used as an identifier for object properties; this is the data type's only purpose.

symbol作为一个基础数据类型,只能用在对象的key中。我个人是很少用到这个类型,或许在Map类中会有不一样的火花。

问题一:js中对象的key可以是对象吗?若不能,js对象的key只能是什么,value呢? 不能。js中对象key只能是字符串和Symbol,value可以是任何值。

FrankKai commented 5 years ago

普通Object和Map的对比

对于Object和Map来说,设置key-value,查询value,删除key,检测key。由于最初js中只有Object一种可以存储key-value的数据类型,所以几乎所有的key-value都是这样存的,所以Map类型也只能用Object将就。但是,有以下几个强烈推荐使用Map数据类型的场景:

FrankKai commented 4 years ago

Map实战

替代原始的对象key,value映射

  1. 创建一个二维数组
    export default [
    ['业务员', 'salesman'],
    ['团队', 'team'],
    ['业务类型', 'businessType'],
    ];
  2. new Map(二维数组)创建
    const dataMap = new Map(data);
  3. map.get()获取对应value
    dataMap.get('业务员'')