Tốt hơn là sử dụng Bản đồ hoặc đối tượng trong JavaScript?
Đối tượng 1 giữ các cặp khóa-giá trị và ghi nhớ thứ tự chèn ban đầu của các khóa. Bất kỳ giá trị nào (cả đối tượng và giá trị nguyên thủy) đều có thể được sử dụng làm khóa hoặc giá trị Show
Thử nóSự miêu tả 1 đối tượng là tập hợp các cặp khóa-giá trị. Một khóa trong 1 chỉ có thể xuất hiện một lần; . Đối tượng 1 được lặp theo cặp khóa-giá trị — vòng lặp 6 trả về một mảng 2 phần tử của 7 cho mỗi lần lặp. Việc lặp lại xảy ra theo thứ tự chèn, tương ứng với thứ tự mà mỗi cặp khóa-giá trị được chèn lần đầu tiên vào bản đồ bằng phương pháp 8 (nghĩa là không có khóa nào có cùng giá trị trong bản đồ khi 8 được gọi Thông số kỹ thuật yêu cầu các bản đồ phải được triển khai "về trung bình, cung cấp thời gian truy cập phụ trên số lượng phần tử trong bộ sưu tập". Do đó, nó có thể được biểu diễn bên trong dưới dạng bảng băm (với tra cứu O(1), cây tìm kiếm (với tra cứu O(log(N))) hoặc bất kỳ cấu trúc dữ liệu nào khác, miễn là độ phức tạp tốt hơn O bình đẳng chínhBình đẳng giá trị dựa trên thuật toán SameValueZero. (Nó đã từng sử dụng SameValue, coi 0 và 1 là khác nhau. Kiểm tra tính tương thích của trình duyệt. ) Điều này có nghĩa là 2 được coi là giống như 2 (mặc dù 4) và tất cả các giá trị khác được coi là bằng nhau theo ngữ nghĩa của toán tử 5Đối tượng vs. bản đồ 6 tương tự như 1—cả hai đều cho phép bạn đặt khóa thành giá trị, truy xuất các giá trị đó, xóa khóa và phát hiện xem có thứ gì đó được lưu trữ tại khóa hay không. Vì lý do này (và vì không có lựa chọn thay thế tích hợp sẵn), 6 đã được sử dụng làm 1 trong lịch sửTuy nhiên, có những khác biệt quan trọng khiến 1 được ưa chuộng hơn trong một số trường hợpMapObjectAccidental KeysA 1 không chứa bất kỳ khóa nào theo mặc định. Nó chỉ chứa những gì được đưa vào nó một cách rõ ràngMột 6 có nguyên mẫu, vì vậy nó chứa các khóa mặc định có thể xung đột với các khóa của chính bạn nếu bạn không cẩn thậnGhi chú. Điều này có thể được bỏ qua bằng cách sử dụng 23, nhưng điều này hiếm khi được thực hiệnSecurityA 1 an toàn khi sử dụng với các khóa và giá trị do người dùng cung cấpĐặt các cặp khóa-giá trị do người dùng cung cấp trên 6 có thể cho phép kẻ tấn công ghi đè nguyên mẫu của đối tượng, điều này có thể dẫn đến các cuộc tấn công tiêm đối tượng. Giống như sự cố về khóa ngẫu nhiên, điều này cũng có thể được giảm thiểu bằng cách sử dụng đối tượng nguyên mẫu 26Các loại khóaKhóa của 1 có thể là bất kỳ giá trị nào (bao gồm hàm, đối tượng hoặc bất kỳ nguyên hàm nào). Khóa của một 6 phải là một 29 hoặc một 90. Đặt hàng chínhCác phím trong 1 được sắp xếp theo cách đơn giản, dễ hiểu. Một đối tượng 1 lặp lại các mục nhập, khóa và giá trị theo thứ tự chèn mục nhậpMặc dù các khóa của một 6 bình thường hiện đã được đặt hàng, nhưng điều này không phải lúc nào cũng đúng và thứ tự rất phức tạp. Do đó, tốt nhất là không nên dựa vào thứ tự tài sảnThứ tự lần đầu tiên được xác định cho các thuộc tính riêng chỉ trong ECMAScript 2015; . Xem các hoạt động đặc tả trừu tượng của OrdinaryOwnPropertyKeys và EnumerateObjectProperties. Nhưng lưu ý rằng không có cơ chế đơn lẻ nào lặp lại tất cả các thuộc tính của đối tượng; . ( 94 chỉ bao gồm các thuộc tính khóa chuỗi có thể đếm được; 95 chỉ bao gồm các thuộc tính khóa chuỗi, có thể đếm được của riêng; 96 bao gồm các thuộc tính có khóa chuỗi, riêng ngay cả khi không thể đếm được; 97 thực hiện tương tự đối với chỉ các thuộc tính có khóa 90, v.v. )Kích thước Số lượng mục trong một 1 có thể dễ dàng lấy ra từ thuộc tính 90 của nó. Số lượng mục trong một 6 phải được xác định thủ công. IterationA 1 là một iterable, vì vậy nó có thể được lặp trực tiếp 6 không triển khai giao thức lặp và do đó, các đối tượng không thể lặp lại trực tiếp bằng cách sử dụng JavaScript cho. của tuyên bố (theo mặc định)Ghi chú
Hoạt động tốt hơn trong các tình huống liên quan đến việc thêm và xóa các cặp khóa-giá trị thường xuyên Không được tối ưu hóa để thường xuyên thêm và xóa các cặp khóa-giá trị Tuần tự hóa và phân tích cú phápKhông có hỗ trợ riêng cho tuần tự hóa hoặc phân tích cú pháp (Nhưng bạn có thể xây dựng hỗ trợ tuần tự hóa và phân tích cú pháp của riêng mình cho 1 bằng cách sử dụng 97 với đối số thay thế của nó và bằng cách sử dụng 98 với đối số hồi sinh của nó. Xem câu hỏi Stack Overflow Làm thế nào để bạn JSON. xâu chuỗi một Bản đồ ES6?)Hỗ trợ riêng cho tuần tự hóa từ 6 sang JSON, sử dụng 97Hỗ trợ gốc để phân tích cú pháp từ JSON sang 6, sử dụng 98Đặt thuộc tính đối tượngĐặt thuộc tính Đối tượng cũng hoạt động cho các đối tượng Bản đồ và có thể gây nhầm lẫn đáng kể Do đó, điều này dường như hoạt động theo cách 2Nhưng cách đặt thuộc tính đó không tương tác với cấu trúc dữ liệu Bản đồ. Nó sử dụng tính năng của đối tượng chung. Giá trị của 'bla' không được lưu trữ trong Bản đồ cho các truy vấn. Các hoạt động khác trên dữ liệu không thành công
Cách sử dụng chính xác để lưu trữ dữ liệu trong Bản đồ là thông qua phương pháp 43
Người xây dựng 44Tạo một đối tượng 1 mớithuộc tính tĩnh 46Hàm tạo được sử dụng để tạo các đối tượng dẫn xuất Thuộc tính cá thể 47Giá trị ban đầu của thuộc tính 48 là chuỗi 49. Tài sản này được sử dụng trong 20 21Trả về số cặp khóa/giá trị trong đối tượng 1Phương thức sơ thẩm 23Xóa tất cả các cặp khóa-giá trị khỏi đối tượng 1 25Trả về 26 nếu một phần tử trong đối tượng 1 đã tồn tại và đã bị xóa hoặc 28 nếu phần tử không tồn tại. 29 sẽ trả lại 28 sau đó 31Trả về giá trị được liên kết với khóa đã truyền hoặc 32 nếu không có 33Trả về một giá trị boolean cho biết liệu một giá trị có được liên kết với khóa đã truyền trong đối tượng 1 hay không 35Đặt giá trị cho khóa đã truyền trong đối tượng 1. Trả về đối tượng 1 38Trả về một đối tượng Iterator mới chứa một mảng hai phần tử của 7 cho mỗi phần tử trong đối tượng 1 theo thứ tự chèn 31Trả về một đối tượng Iterator mới chứa các khóa cho từng phần tử trong đối tượng 1 theo thứ tự chèn 33Trả về một đối tượng Iterator mới chứa các giá trị cho từng phần tử trong đối tượng 1 theo thứ tự chèn 35Trả về một đối tượng Iterator mới chứa một mảng hai phần tử của 7 cho mỗi phần tử trong đối tượng 1 theo thứ tự chèn 38Gọi 39 một lần cho mỗi cặp khóa-giá trị có trong đối tượng 1, theo thứ tự chèn. Nếu một tham số 01 được cung cấp cho 02, nó sẽ được sử dụng làm giá trị 03 cho mỗi lần gọi lạiví dụSử dụng đối tượng Bản đồ 2Sử dụng NaN làm khóa Bản đồ 2 cũng có thể được sử dụng làm chìa khóa. Mặc dù mọi 2 không bằng chính nó ( 4 là đúng), ví dụ sau hoạt động vì các 2 không thể phân biệt được với nhau
Bản đồ hoặc Đối tượng nhanh hơn trong JavaScript?Kết quả tương tự với các trường hợp khóa chuỗi đó. Bản đồ bắt đầu nhanh hơn nhiều so với các đối tượng (chèn và xóa nhanh hơn 2 lần, lặp lại nhanh hơn 4-5 lần), nhưng đồng bằng đang giảm dần .
Tại sao lại sử dụng bản đồ thay vì JavaScript đối tượng?Bản đồ có thể lặp lại, do đó, nó có thể được lặp lại trực tiếp . Đối tượng không triển khai giao thức lặp và do đó, các đối tượng không thể lặp lại trực tiếp bằng cách sử dụng JavaScript cho. của tuyên bố (theo mặc định).
Lợi ích của việc sử dụng bản đồ thay vì Đối tượng JavaScript đơn giản để lưu trữ khóa là gìTóm lại, Bản đồ tương tự như Đối tượng ở chỗ chúng chứa các cặp khóa/giá trị, nhưng Bản đồ có một số lợi thế so với đối tượng. Kích thước - Bản đồ có thuộc tính kích thước , trong khi Đối tượng không có cách tích hợp để truy xuất kích thước của chúng. Lặp lại - Bản đồ có thể lặp lại trực tiếp, trong khi Đối tượng thì không. |