JavaScript 中的映射与对象
Map是一种数据结构,有助于以对的形式存储数据。该对由一个唯一键和一个映射到该键的值组成。它有助于防止重复。
Object遵循与 map 相同的概念,即使用键值对存储数据。但是有一些细微的差别使得 map 在某些情况下表现更好。
几个基本的区别如下:
- 在 Object 中,key-field 的数据类型被限制为整数、字符串和符号。而在 Map 中,key-field 可以是任何数据类型(整数、数组,甚至是对象!)
- 在 Map 中,元素的原始顺序被保留。对于对象,情况并非如此。
- Map 是一个对象的实例,但反之亦然。
例子:
输出:
true
false
让我们深入探讨一些使 Object 与 Map 不同的概念。
- 宣言:
在 JavaScript 中,有很多方法可以创建对象。例如:- 通过使用直接字面量:
var obj = {}; var obj = {1:"Object Name", 2:"Test"}; console.log(obj);
输出:
Object
- 构造函数的使用:
var obj = new Object(); //Empty object var obj = new Object; console.log(obj);
输出:
Object
- 使用 object.create
function fruits() { this.name = 'fruit 1'; this.season = 'summer'; } function apple() { fruits.call(this); } apple.prototype = Object.create(fruits.prototype); const app = new apple(); console.log(app.name); console.log(app.season);
fruit 1 summer
另一方面,地图只有一种创建方式。
var map = new Map();//Empty console.log(map); var map = new Map([[1, "Sam"], [2, "John"]]); // 1-> Sam, 2->John console.log(map);
输出:
Map(0) Map(2)
- 通过使用直接字面量:
- 访问元素:
- Map 使用其内置的get() 方法来访问其元素。
map.get(1);
- 对象只需使用带有点运算符的“键”名称来访问其元素。
obj.id; obj[id];
- Map 使用其内置的get() 方法来访问其元素。
- 检查密钥是否已存在:
- Map 为此使用了它的内置 has()函数。
map.has(1);//returns boolean value true or false.
- 对象使用 '==='运算符来执行任务。
var doExist = obj.1 === undefined; //returns boolean value.
- Map 为此使用了它的内置 has()函数。
- 添加新元素:
- Map 使用 set() 方法添加新元素。
map.set(4, 5); //{5->4, 7->9, 4->5}
- 在对象中,它是直接完成的。
obj["Demo"]="Map vs Object"; //{1->Object Name, 2->Test, Demo->Map vs Object}
- Map 使用 set() 方法添加新元素。
- 获取尺寸:
- 地图会自动更新其大小并获得最简单的。
console.log(map.size);
- 在 object 中,需要使用帮助 Object.keys() 手动计算大小。
console.log(Object.keys(obj).length);
- 地图会自动更新其大小并获得最简单的。
因此,我们可以看到 Map 具有更好的性能和更少的代码结构,这使其优于 Object。但是,有些场景需要使用对象。让我们看看。
何时何地使用对象:
- 对于我们需要简单的结构来存储数据并且所需的键类型是整数、字符串或符号的情况,对象是一个很好的选择。
- 需要对单个属性元素应用单独逻辑的场景,对象绝对是首选。
- JSON 直接支持对象,但不支持 map(还)。
- Map 完全是散列,而 Object 不止于此。
尽管 Map 往往比对象具有更多优势,但最终它取决于所使用的数据类型和需要执行的操作。
然而,在 map 优于 object 的所有优点中,map 不能替换 JavaScript 中的 object,因为 Object 不仅仅是一个哈希表。如果存在其他选择,则不应仅将其用于散列。