Chúng không tương đương. Sự khác biệt chính là thiết
a.x = undefined
nghĩa là a.hasOwnProperty("x")
vẫn sẽ trở thành sự thật, và do đó, nó vẫn sẽ hiển thị trong một vòng lặp for in
, và trong Object.keys()
delete a.x
nghĩa là a.hasOwnProperty("x")
sẽ trả về false
Cách chúng giống nhau là bạn không thể biết được thuộc tính có tồn tại hay không bằng cách thử nghiệm
if (a.x === undefined)
nào bạn không nên làm nếu bạn đang cố gắng để xác định xem một tài sản tồn tại, bạn nên luôn luôn sử dụng
// If you want inherited properties
if ('x' in a)
// If you don't want inherited properties
if (a.hasOwnProperty('x'))
Tiếp nối chuỗi nguyên mẫu (được đề cập bởi zzzzBov) Gọi delete
sẽ cho phép nó đi lên chuỗi nguyên mẫu, trong khi đặt giá trị thành không xác định sẽ không tìm kiếm thuộc tính trong các nguyên mẫu bị xích http://jsfiddle.net/NEEw4/1/
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype
Xóa các thuộc tính thừa kế Nếu thuộc tính bạn đang cố gắng xóa được kế thừa, delete
sẽ không ảnh hưởng đến nó. Tức là, delete
chỉ xóa thuộc tính khỏi đối tượng, chứ không phải thuộc tính được kế thừa.
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype
Do đó, nếu bạn cần phải chắc chắn giá trị của một đối tượng sẽ được undefined, delete
sẽ không hoạt động khi tài sản được thừa kế, bạn sẽ phải thiết lập (override) nó để undefined
trong trường hợp đó. Trừ khi nơi đó là kiểm tra nó sẽ sử dụng hasOwnProperty
, nhưng nó có khả năng sẽ không được an toàn để giả định rằng ở khắp mọi nơi để kiểm tra nó sẽ sử dụng hasOwnProperty
Toán tử xóa sẽ xóa hoàn toàn thuộc tính. Đặt thuộc tính thành không xác định sẽ xóa giá trị. Đặt một thuộc tính thành null sẽ thay đổi giá trị thành giá trị null. Đây là một thử nghiệm perf nếu bạn thích: http://jsperf.com/delete-vs-undefined-vs-null/3 – j08691
@ j08691 Nit: Nó không loại bỏ giá trị. Nó gán 'undefined' làm giá trị, mà vẫn là một .. –
Bạn nên nói về lý do tại sao bạn quan tâm đến điều này, sau đó câu trả lời có thể phục vụ cho vấn đề thực tế của bạn. –