2012-12-20 29 views
10

Giả sử tôi có một mảng liên kết Foo, với thanh khóa và giá trị xyz.Trong Javascript cái gì hiệu quả hơn, xóa một phần tử hoặc đặt nó thành không xác định rõ ràng

console.log(Foo['bar']); 

>> xyz 

delete Foo['bar']; 
console.log Foo['bar']; 

>> undefined 

Foo['bar'] = 'xyz'; 
console.log(Foo['bar']); 

>> xyz 

Foo['bar'] = undefined; 
console.log (Foo['bar']); 

>> undefined 

Câu hỏi của tôi là cái nào hiệu quả hơn, chúng có khác biệt gì không? Có một kịch bản khi tôi nên sử dụng một trong những khác?

Cảm ơn!

Kết quả:

Cảm ơn mọi người đã trợ giúp và cho tôi xem jsperf. Đặt nó thành undefined có vẻ là (tương đối) nhanh hơn đáng kể sau đó xóa, mặc dù tất cả các thông báo chỉ ra bên dưới cũng rất thú vị (trên thực tế, có lẽ tôi sẽ sử dụng xóa rất nhiều để tránh các lỗi trong tương lai).

+2

nhảy qua http://www.jsperf.com và tìm hiểu. – jAndy

+0

Đã được thử nghiệm ở đây? http://jsperf.com/delete-vs-undefined-vs-null/3 – JSuar

+0

Đặt khóa thành 'undefined' không loại bỏ khóa trong đối tượng của bạn: http://i.imgur.com/LvPDC .png – Blender

Trả lời

2

Nó sẽ tạo sự khác biệt về hiệu suất tiêu cực trong thời gian dài là b vẫn được coi là thuộc tính sau khi chuyển nhượng sau sang undefined. Ví dụ:

var a = { b : 0 }; 

a.b = undefined; 

a.hasOwnProperty("b"); 
>>> true 

Cùng đi với các từ khóa in ("b" in a là đúng) vì vậy đây rất có thể sẽ cản trở lặp khi một phần của một đối tượng lớn hơn.

4

Tôi không đánh giá hiệu suất của các hoạt động đó (như tôi đã đề cập trong nhận xét, chỉ cần tạo một điểm chuẩn nhỏ trên http://www.jsperf.com), nhưng tôi sẽ mất một số từ về sự khác biệt.

Bạn sẽ luôn luôn được tốt trên delete tính ing, wheras thiết lập chúng để undefined hoặc null sẽ cho mọi người và/hoặc mã treo, mà kiểm tra với các nhà điều hành IN.

Giống như

if('bar' in Foo) { } 

vẫn sẽ trở lại true nếu bạn thiết lập Foo.bar-undefined. Nó sẽ không nếu bạn đi với delete Foo.bar.

+0

Cảm ơn bạn đã phản hồi tuyệt vời, tôi đã bình chọn nó. Tôi đã đưa nó cho David như ông cũng đã đề cập hasOwnProperty. –

1

From the link I commented:

Nhà điều hành xóa bỏ một tài sản hoàn toàn. Đặt thuộc tính là không xác định sẽ xóa giá trị. Đặt thuộc tính là null sẽ thay đổi giá trị thành giá trị null.

Về mặt kỹ thuật chúng không tương đương, nhưng trên thực tế chúng thường là được sử dụng để có cùng ý nghĩa: rằng thuộc tính chưa được đặt.

Đặt đối tượng thành null là nhanh nhất.

Một số nguồn lực tốt để tìm hiểu các hoạt động này:

+0

null được sử dụng sai trong mã js mà tôi đã thấy.Nó biểu thị một giá trị null cố ý, trái ngược với một giá trị chưa được thiết lập. Liên kết tốt để chỉ ra rằng chúng không tương đương. – Aesthete

4

Hãy biết rằng việc xóa một tài sản từ một đối tượng sẽ thay thế tài sản đó với một trong những tên tương tự nếu một tồn tại trên chuỗi nguyên mẫu.

Đặt thuộc tính thành rỗng hoặc không xác định sẽ chỉ đơn giản là che dấu nó.

1

Vì việc xóa thuộc tính không thực hiện điều tương tự như cài đặt nó thành không xác định, nó thực sự phụ thuộc vào kết quả lập trình bạn muốn.

delete Foo['bar']; xóa thuộc tính bar khỏi đối tượng Foo. Nó sẽ không có ở đó nếu ai đó lặp lại các thuộc tính trực tiếp của Foo.

Foo['bar'] = undefined đặt thuộc tính thành không xác định nhưng vẫn tồn tại trên đối tượng và vẫn sẽ ở đó nhưng có giá trị là undefined.

Vì vậy, nếu bạn muốn loại bỏ thuộc tính, hãy sử dụng delete. Nếu bạn muốn thuộc tính vẫn ở đó, nhưng có giá trị undefined, hãy đặt giá trị đó thành undefined.

Nếu bạn thực sự chỉ muốn biết điều gì là nhanh nhất và vì lý do nào đó không quan tâm đến sự khác biệt của chương trình, hãy truy cập jsperf.com, tự tạo hai trường hợp kiểm tra so sánh và chạy jsperf trong một loạt các trình duyệt khác nhau có liên quan đến bạn. Tất cả các câu hỏi về hiệu suất phải được trả lời với thử nghiệm thực tế có liên quan.

+0

Cảm ơn bạn đã phản hồi tuyệt vời, tôi đã bình chọn nó. Tôi đưa nó cho David vì anh ta cũng đưa ra các ví dụ về mã. –

2

Ngoài việc đánh giá hành động thực tế của việc xóa hoặc gán cho undefined, bạn cũng nên xem xét ý nghĩa hiệu suất trong tương lai của việc sử dụng đối tượng sau khi bạn thay đổi nó.

tôi có thể nghĩ đến hai:

  1. Khi tài sản bị xóa, hãy truy cập vào nó sẽ gây ra hoạt Javascript để xem nó lên trong the prototype chain, trong khi đó nếu tài sản vẫn còn tồn tại trên đối tượng (với giá trị undefined), chuỗi nguyên mẫu sẽ không được tìm kiếm.

  2. Xóa thuộc tính sẽ thay đổi "hình dạng đối tượng" và có thể làm tổn thương JavaScript optimizations.

Các vấn đề liên quan