Như Mike Samuel chỉ ra trong câu trả lời của mình, một trong những cách sử dụng phổ biến nhất của xóa là khi bạn xử lý một đối tượng như một "túi tài sản" kết hợp tên với giá trị. Có một sự khác biệt hợp lý giữa "tên này bây giờ được ánh xạ tới một số giá trị không có thật" và "tên này không được ánh xạ ở tất cả". "xóa" đạt được sau này.
Đó là tất cả được hiểu một cách hợp lý. Tôi nghĩ rằng tôi có thể thêm một lưu ý lịch sử thú vị liên quan đến các công cụ JScript 1.0 đến 5.0.
Trong những triển khai gốc của Microsoft của JScript, chúng tôi đã sử dụng các đối tượng IDispatch kiểu tự động hóa OLE để triển khai đối tượng expando. IDispatch của khóa học hoạt động bằng cách liên kết một tên với một "id công văn", mà chỉ đơn giản là một số nguyên. Để gọi động, trước tiên bạn yêu cầu đối tượng gửi để cung cấp cho bạn ID công văn được liên kết với tên và sau đó bạn nói "bây giờ gọi phương thức được liên kết với ID này, được cung cấp các đối số".
Đó là tất cả tốt và tốt. Nhưng một trong những yêu cầu của hợp đồng IDispatch là ánh xạ từ tên đến ID công văn là ổn định trong toàn bộ vòng đời của đối tượng. Vì vậy, nếu ai đó nói "thêm thuộc tính Foo cho đối tượng này", thì chúng tôi có thể quyết định rằng thuộc tính Foo được liên kết với công cụ nhận dạng 0x1234 trong đối tượng đó. Từ thời điểm đó trở đi, mỗi lần đối tượng được yêu cầu nhập mã nhận dạng của "Foo", nó phải trả về 0x1234, ngay cả khi Foo bị xóa và sau đó được thêm lại. Điều này cho phép người gọi duy trì bộ nhớ cache nhanh của các cặp tên/phân phối thay vì luôn phải hỏi đối tượng trên mọi yêu cầu.
Kết quả thực tế về điều đó là "xóa" không theo bất kỳ cách nào làm giảm gánh nặng bộ nhớ trên đối tượng trong việc thực hiện đó! Khi bạn xóa một thuộc tính (trong triển khai ban đầu), chúng ta phải thêm một chút vào đối tượng đánh dấu công cụ nhận dạng đã xóa, nhưng chúng ta phải giữ lại tất cả thông tin về việc ghép cặp tên/id trong trường hợp tên đó quay trở lại. Thêm một số lượng lớn các thuộc tính vào một đối tượng và sau đó xóa tất cả chúng không thu nhỏ đối tượng trong bộ nhớ.
Công cụ JScript dĩ nhiên đã được viết lại hoàn toàn kể từ thời gian của tôi (ngoại trừ, tôi tin, trình phân tích cú pháp và lexer) vì vậy tôi không biết liệu động cơ vẫn còn có sự không bình thường này. Nó sẽ là thú vị để tìm hiểu.
Nguồn
2012-01-20 20:35:26
Hành vi của 'xóa' không phức tạp chút nào.Nhưng nó ** thực sự ** không nên được gọi là 'xóa'. JavaScript tương tự như cú pháp C++, sử dụng toán tử C++ nhưng làm điều gì đó * hoàn toàn khác biệt * với nó là một chút oops và đã gây ra tất cả sự nhầm lẫn này. (Nếu nó được gọi là 'loại bỏ', tôi cá là mọi người sẽ không bị bối rối.) –
http://perfectionkills.com/understanding-delete/ – Raghu