Tập hợp khoá

Bạn có thể sử dụng các giá trị cố định Đối tượng để lưu trữ các cặp khoá-giá trị và sử dụng Mảng để lưu trữ tập hợp giá trị có thể lặp lại. ES6 cũng giới thiệu các cấu trúc dữ liệu chuyên biệt để phù hợp với các trường hợp sử dụng chi tiết hơn: Ánh xạ cho các cặp khoá-giá trị và Đặt cho giá trị riêng lẻ.

Bản đồ

Bản đồ là một cấu trúc dữ liệu có thể lặp lại, lưu trữ thông tin dưới dạng các cặp khoá-giá trị, tương tự như chữ Đối tượng. Không giống như giá trị cố định Đối tượng, Bản đồ cho phép cả hai giá trị và khoá để có bất kỳ loại dữ liệu nào, và các yếu tố thứ tự được thêm vào một Bản đồ là được bảo toàn khi lặp lại qua nó.

Để tạo một Bản đồ, hãy sử dụng hàm khởi tạo Map():

const myMap = new Map();

myMap;
> Map(0)

Bạn có thể điền sẵn dữ liệu vào Bản đồ bằng cú pháp giống như một mảng (hoặc bất kỳ đối tượng biến lặp nào) có chứa các đối tượng giống mảng được tạo thành từ 2 phần tử. Phần tử đầu tiên trong mỗi cấu trúc dữ liệu hai phần tử trở thành khoá, còn cấu trúc thứ hai trở thành giá trị liên kết với khoá đó. Dạng đơn giản nhất của điều này là hiệu quả, một mảng trong trong đó mỗi phần tử là một mảng được tạo thành từ hai phần tử là khoá và giá trị của phần tử sẽ được thêm vào Bản đồ:

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

Xin nhắc lại, đối tượng Map khác với một đối tượng cố định ở chỗ cả hai giá trị đều có giá trị và các khoá có thể nhận mọi loại dữ liệu và giá trị:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

Để tải, đặt hoặc xoá các thành phần của Bản đồ, hãy dùng các phương thức kế thừa từ Map hàm khởi tạo:

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

Các khoá trong một Maps là duy nhất, nghĩa là việc đặt một khoá giống nhau sẽ ghi đè cặp khoá-giá trị được lưu trữ trước đó:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

Tương tự như với các đối tượng, bạn có thể gán tệp Map cho một biến được khai báo bằng const và sau đó sửa đổi Bản đồ đó. Tuy nhiên, cũng giống như các trường hợp sử dụng khác của const, bạn không thể thay đổi hoặc xoá chính biến đó:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

WeakMap là một bản đồ chứa "yếu" tài liệu tham khảo, phải tham chiếu đến Đối tượng hoặc Biểu tượng chưa được thêm vào sổ đăng ký biểu tượng chung.

Để tạo một WeakMap, hãy sử dụng hàm khởi tạo WeakMap():

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

Cú pháp WeakMap tương tự như Map, nhưng WeakMaps thì không iterable (có thể lặp lại) và cố gắng sử dụng bất kỳ giá trị nào khác ngoài đối tượng hoặc biểu tượng dưới dạng khoá đều gây ra lỗi cú pháp. Khi không tham chiếu đến khoá tồn tại bên ngoài WeakMap, đối tượng hoặc biểu tượng đó và giá trị được liên kết trong WeakMap, cả hai đều đủ điều kiện để thu gom rác.

Điều này cho phép các trường hợp sử dụng như lưu trữ siêu dữ liệu liên kết với một đối tượng trong WeakMap, sử dụng việc tham chiếu đến đối tượng làm khoá. Nếu không có tệp đối chiếu nào khác tồn tại với Đối tượng này và Đối tượng bị xoá khỏi bộ nhớ, các lớp siêu dữ liệu cũng bị xóa.

Đặt

Tập hợp là một tập hợp các giá trị duy nhất có thể lặp lại tương tự như một mảng, mặc dù Tập hợp chỉ có thể chứa các giá trị duy nhất. Giống như với Bản đồ, việc lặp lại qua Tập hợp đặt giữ lại các phần tử thứ tự đã được thêm vào đó.

Để tạo một Tập hợp, hãy sử dụng hàm khởi tạo Set():

const mySet = new Set();

mySet;
> Set []

Bạn cũng có thể tạo Tập hợp từ giá trị cố định Mảng:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Vì Tập hợp không cho phép các phần tử trùng lặp, nên khi Tập hợp được tạo từ một chứa nhiều thực thể của cùng một giá trị, nó chỉ giữ lại giá trị đầu tiên thực thể của giá trị đó:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Để thêm hoặc xoá phần tử khỏi một Tập hợp, hãy sử dụng các phương thức kế thừa từ Set hàm khởi tạo. Các phương thức này hoạt động dựa trên một phần tử dựa trên giá trị của phần tử đó thay vì tham chiếu đến một chỉ mục:

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

Mặc dù Tập hợp không phải là tập hợp được lập chỉ mục và không được dùng làm do đó, các phần tử trong một Tập hợp được lặp lại theo thứ tự chèn. Các lần thử thêm một giá trị phần tử trùng lặp vào một Tập hợp: bị bỏ qua, giữ nguyên đơn đặt hàng quảng cáo ban đầu:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

Để tạo một Mảng từ một Tập hợp, hãy sử dụng phương thức Array.from() hoặc trải rộng cú pháp:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet là một tập hợp chỉ chứa các giá trị có thể thu gom rác, chẳng hạn như tham chiếu đến Đối tượng hoặc Biểu tượng chưa được thêm vào sổ đăng ký biểu tượng chung.

Để tạo một WeakSet, hãy sử dụng hàm khởi tạo WeakSet():

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

Cú pháp WeakSet tương tự như Set, mặc dù WeakSet thì không iterable (có thể lặp lại) và cố gắng thêm bất kỳ giá trị nào khác ngoài đối tượng hoặc biểu tượng đều gây ra lỗi cú pháp. Giống như WeakMap, khi không có tham chiếu nào khác đến một giá trị được tham chiếu bởi một WeakSet tồn tại, giá trị đó sẽ đủ điều kiện cho thu gom rác.

Điều này cho phép các trường hợp sử dụng như tổng hợp một tập hợp duy nhất, có thể lặp lại các đối tượng có liên quan. Nếu không có tệp tham chiếu nào khác đến Đối tượng được tham chiếu bằng WeakSet, phần tử liên kết cũng bị xoá khỏi WeakSet.

Kiểm tra kiến thức

Như sau:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

myMap trả về giá trị nào?

100
"My string"
undefined