2010-07-09 25 views
7

Tôi đã đi qua hai cách khác nhau để xác định/đặt tên đối tượng và chức năng trong JavaScript trước tiên kiểm tra sự tồn tại của tên trước khi sử dụng nó. Vấn đề là, tôi không biết cái nào là tốt hơn (từ các quan điểm về tốc độ và khả năng sử dụng) và không thể sử dụng toán tử boolean trong tìm kiếm của Google để tìm ra nó.Định nghĩa đối tượng JavaScript có điều kiện - điều nào tốt hơn?

Người đầu tiên tôi nhìn thấy thường xuyên nhất:

var myNewObject = myNewObject ? myNewObject : function() { 
    // Code goes here. 
}; 

thứ hai dường như ngắn gọn hơn, nhưng tôi đã chỉ nhìn thấy nó một hoặc hai nơi, vì vậy tôi không biết nếu có một tiêu chuẩn hoặc thậm chí một tên cho nó:

var myNewObject = myNewObject || function() { 
    // Code goes here. 
}; 

về mặt chức năng, cả hai đều làm điều tương tự và cả hai đều có vẻ làm việc ở mọi trình duyệt tôi có thể kiểm tra trong câu hỏi của tôi là thế này - đó là tốt hơn và tại sao.? Ngoài ra, trong khi định nghĩa đầu tiên về cơ bản là một điều kiện đơn dòng ... thì cái thứ hai được gọi là gì?

+0

thứ hai là phổ biến hơn. Ít nhất đối với những người biết ngôn ngữ ... – galambalazs

+0

Thật tuyệt, có ai biết điều này có hoạt động với nguyên mẫu không: ví dụ: Array.prototype.forEach = Array.prototype.forEach || chức năng (... Tôi hỏi vì trên trang web Mozilla họ sử dụng bình thường nếu (! Array.prototype.forEach) Array.prototype.forEach = function (... –

+0

@Marco Demaio Theo cùng một logic là * nên * làm việc Tôi muốn đề nghị tát nó trong một kịch bản thử nghiệm và xem nếu nó có.Bạn vẫn đang định nghĩa một phương thức đối tượng ... nó chỉ xảy ra trong một không gian tên cụ thể. – EAMann

Trả lời

5

Tôi sẽ chọn sau nếu chỉ cho thực tế là bạn nhập myNewObject hai lần thay vì ba lần.

Ngoài ra, trong khi định nghĩa đầu tiên về bản chất là một điều kiện một dòng ... thì điều thứ hai được gọi là gì?

Short-circuit evaluation

+2

Chấp nhận điều này làm câu trả lời vì bạn cũng đã cho tôi tên của phương pháp thứ hai. Nó sẽ tiết kiệm rất nhiều thời gian cho tôi biết nó được gọi là gì ... Tôi không biết đó là một cách tiếp cận hợp pháp, chỉ là nó dường như hoạt động. – EAMann

1

FWIW Tôi thấy cách tiếp cận thứ hai thường xuyên hơn, và (đối với phần của tôi) tôi cảm thấy nó rõ ràng hơn, ngắn gọn và thành ngữ.

5

Tôi sẽ sử dụng ví dụ thứ hai, được mô tả là (Đánh giá tối thiểu). Nó đơn giản và có vẻ dễ đọc hơn.

Giống như nhận sự kiện từ phương thức onClick trên nhiều trình duyệt.

element.onclick = function (evt) { 
    evt = evt || window.event 
} 
+1

+1 cho ví dụ – galambalazs

2

Sau đó, nó tương tự để các nhà điều hành rỗng liên hiệp trong C# ?? khi được sử dụng theo cách mà

see: Is there a "null coalescing" operator in JavaScript?

+1

Lưu ý rằng không hoàn toàn tương đương, '??' trong C# nó sẽ trả về giá trị mặc định chỉ khi giá trị toán hạng trái của nó là 'null', trong JavaScript' || 'sẽ thực hiện khi toán hạng đầu tiên của nó là * falsy *, falsy các giá trị là: 'null',' undefined', '0',' NaN', chuỗi rỗng và 'false'. – CMS

+0

@CMS, vâng, do đó liên kết để làm rõ. Tôi nên đã viết rằng nó * tương tự * với toán tử '??' – CaffGeek

0

Cả hai phương pháp làm việc. Nhưng tôi nghĩ rằng phiên bản tối ưu nhất là chỉ cần sử dụng một bình thường nếu xét nghiệm như:

if(!myNewObject) 
    myNewObject = ... 

Làm trong bất kỳ một trong những phương pháp bạn đề nghị trong câu trả lời của bạn, nó có thể liên quan đến một giao lại không cần thiết mỗi khi chức năng/đối tượng đã được xác định. Ý tôi là nếu myNewObject đã được xác định, thời gian chạy JavaScript sẽ phải thực hiện việc gán lại không cần thiết myNewObject = myNewObject (trừ khi thời gian chạy không tối ưu hóa nó ra).

Trên trang web Mozilla, họ đề xuất sử dụng đơn giản nếu, view this.

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