--- title: Map slug: Web/JavaScript/Reference/Global_Objects/Map tags: - ES6 - JavaScript - Map - cách dùng - hàm translation_of: Web/JavaScript/Reference/Global_Objects/Map ---
Đối tượng Map
lưu cặp key-value (khoá - giá trị) theo thứ tự chèn vào của khoá. Bất kỳ giá trị nào (cả đối tượng (objects) và {{Glossary("Primitive", "primitive values")}}) đều có thể sử dụng làm key hoặc value.
new Map([iterable])
iterable
[[ 1, 'one' ],[ 2, 'two' ]]
). Mỗi cặp key-value sẽ được thêm vào Map
mới; những giá trị null
chuyển thành undefined
.Một Map
object duyệt qua các phần tử của nó theo thứ tự chèn vào –– một vòng lặp {{jsxref("Statements/for...of", "for...of")}} trả về một mảng [key, value]
cho mỗi lần lặp.
Key được xác định bằng nhau dựa vào giải thuật "SameValueZero": NaN
được xem là giống NaN
(mặc dù NaN !== NaN
) và tất cả các giá trị khác được xem xét bằng nhau theo toán tử ===
. Trong đặc tả ECMAScript hiện tại, -0
và +0
là bằng nhau, cho dù điều này không đúng ở các bản dự thảo trước đó. Xem "Value equality for -0 and 0" trong bảng tương thích trình duyệt để biết thêm chi tiết.
{{jsxref("Object", "Objects")}} tương tự với Maps
ở chỗ cả hai đều cho phép bạn đặt keys cho values, lấy các values, xoá các keys và xem có gì được chứa trong một key không. Bởi vì điều này (và bởi vì trước đây không tích hợp các lựa chọn khác), trong lịch sử, Object
s đã được dùng như Map
s; Tuy vậy, có những điểm khác biệt khiến sử dụng một Map
thích hợp hơn trong các trường hợp nhất định:
Map
dễ dàng qua thuộc tính size
, trong khi số thuộc tính trong một Object
phải xác định thủ công.Map
là một iterable và do đó có thể được duyệt trực tiếp, trong khi để duyệt qua một Object
cần lấy các keys của nó rồi mới duyệt.Object
có một prototype, vậy nên có các keys mặc định có thể xung đột với các keys của bạn nếu không cẩn thận. Ở ES5, điều này có thể tránh bằng cách sử dụng map = Object.create(null)
, nhưng hiếm khi thực hiện.Map
có thể thực thi tốt hơn ở các hoàn cảnh thường xuyên thêm và xoá các cặp keys.Map.length
length
là 0.Map
constructor. Allows the addition of properties to all Map
objects.?Tất cả Map
instances kế thừa từ {{jsxref("Map.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Map/prototype','Methods')}}
var myMap = new Map(); var keyString = 'a string', keyObj = {}, keyFunc = function() {}; // đặt các values myMap.set(keyString, "value associated with 'a string'"); myMap.set(keyObj, 'value associated with keyObj'); myMap.set(keyFunc, 'value associated with keyFunc'); myMap.size; // 3 // lấy các values myMap.get(keyString); // "value associated with 'a string'" myMap.get(keyObj); // "value associated with keyObj" myMap.get(keyFunc); // "value associated with keyFunc" myMap.get('a string'); // "value associated with 'a string'" // ?vì keyString === 'a string' myMap.get({}); // undefined, vì keyObj !== {} myMap.get(function() {}) // undefined, vì keyFunc !== function () {}
NaN
có thể sử dụng làm một key. Kể cả khi mỗi NaN
không bằng chính nó (NaN !== NaN
trả về true), ví dụ sau chạy tốt bởi vì các NaNs không phân biệt lẫn nhau:
var myMap = new Map(); myMap.set(NaN, 'not a number'); myMap.get(NaN); // "not a number" var otherNaN = Number('foo'); myMap.get(otherNaN); // "not a number"
Maps có thể được duyệt với vòng lặp for..of
:
var myMap = new Map(); myMap.set(0, 'zero'); myMap.set(1, 'one'); for (var [key, value] of myMap) { console.log(key + ' = ' + value); } // 0 = zero // 1 = one for (var key of myMap.keys()) { console.log(key); } // 0 // 1 for (var value of myMap.values()) { console.log(value); } // zero // one for (var [key, value] of myMap.entries()) { console.log(key + ' = ' + value); } // 0 = zero // 1 = one
Maps có thể được duyệt bằng phương thức forEach()
:
myMap.forEach(function(value, key) { console.log(key + ' = ' + value); }); // Will show 2 logs; first with "0 = zero" and second with "1 = one"
var kvArray = [['key1', 'value1'], ['key2', 'value2']]; // Sử dụng hàm khởi tạo Map để chuyển một 2D key-value Array vào một map var myMap = new Map(kvArray); myMap.get('key1'); // returns "value1" // Sử dụng hàm Array.from để chuyển một map vào một 2D key-value Array console.log(Array.from(myMap)); // Sẽ hiện ra Array giống hệt kvArray // Hoặc sử dụng duyệt keys hoặc values và chuyển chúng thành một mảng console.log(Array.from(myMap.keys())); // Sẽ hiện ["key1", "key2"]
Giống như Arrays, Maps có thể được nhân bản:
var original = new Map([ [1, 'one'] ]); var clone = new Map(original); console.log(clone.get(1)); // one console.log(original === clone); // false. Useful for shallow comparison
Keep in mind that the data itself is not cloned
Maps có thể được gộp lại, vẫn đảm bảo các key là duy nhất:
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); var second = new Map([ [1, 'uno'], [2, 'dos'] ]); // Merge two maps. The last repeated key wins. // Spread operator essentially converts a Map to an Array var merged = new Map([...first, ...second]); console.log(merged.get(1)); // uno console.log(merged.get(2)); // dos console.log(merged.get(3)); // three
Maps cũng có thể được gộp với Arrays:
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); var second = new Map([ [1, 'uno'], [2, 'dos'] ]); // Merge maps with an array. The last repeated key wins. var merged = new Map([...first, ...second, [1, 'eins']]); console.log(merged.get(1)); // eins console.log(merged.get(2)); // dos console.log(merged.get(3)); // three
Specification | Status | Comment |
---|---|---|
{{SpecName('ES2015', '#sec-map-objects', 'Map')}} | {{Spec2('ES2015')}} | Initial definition. |
{{SpecName('ESDraft', '#sec-map-objects', 'Map')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Map")}}