2013-07-16 18 views
8

Từ cuốn sách duy trì hoạt Javascript nó đề cập:Tại sao nó không phải là tốt để sử dụng để kiểm tra nếu đối số được truyền

// Bad: Testing to see if an argument was passed 
function doSomething(arg1, arg2, arg3, arg4){ 
if (arg4 != null){ 
    doSomethingElse(); 
    } 
} 

nhưng tôi cảm thấy sử dụng != null ở đây là khá hiệu quả, nó được lọc cả trường hợp đối số không được thông qua hoặc nó được thông qua là null

bất kỳ lý do gì khiến tác giả đề xuất xấu?

+4

Làm cách nào chúng ta biết tác giả đang nghĩ gì? Hãy hỏi tác giả! –

+0

Tôi giả định lời khuyên này được cung cấp bởi vì nó rất hữu ích để phân biệt giữa 'null' và không có đối số. 'undefined' thường có nghĩa là" chưa được đưa ra một giá trị "trong khi' null' thường có nghĩa là "cố ý đưa ra một giá trị không có gì". – apsillers

+0

Giải thích nằm trên trang trước trang có mã bạn đăng. – j08691

Trả lời

8

!= null là sai cho undefined, về cơ bản có nghĩa là x !== null && x !== undefined. != loại cưỡng chế, và một trong những tác động của nó là nó xử lý nullundefined tương đương (null == undefined là đúng).

Vì vậy, trừ khi bạn muốn điều đó, một số người khuyên bạn không nên sử dụng != với null (hoặc undefined).

Và bạn hoàn toàn đúng rằng mã bảo vệ chống lại hai (cũng thực sự ba) khả năng:

  1. Không có gì đã được thông qua cho các đối số ở tất cả.

  2. null đã được chuyển.

  3. undefined đã được chuyển.

Nhưng những nhận xét nói đó là một cách xấu để kiểm tra xem một cuộc tranh cãi đã được thông qua, và nó là: Bởi vì nó không bắt đi null hoặc undefined. (Đi qua số null và không chuyển qua số mọi thứ là các trường hợp khác nhau.) Điều đó không nhất thiết có nghĩa là đó là cách xấu để kiểm tra đối số cho một hàm cụ thể.

-1

Vì bạn có thể chuyển bất kỳ thứ gì vào hàm, cũng null. Nếu bạn muốn những điều sau đây:

var obj = new MyObject(); 
// ... 
obj = null; 
// ... 
doSomething(arg1, arg2, arg3, obj); 

Bạn sẽ trôi qua một cuộc tranh cãi nhưng việc kiểm tra của bạn sẽ thất bại vì các tài liệu tham khảo thông qua là rỗng. Luôn sử dụng các mục sau:

if(typeof arg4 != 'undefined') 
    // ... 
+0

Tại sao việc kiểm tra thất bại? Dường như rõ ràng rằng mã có ý định bảo vệ chống lại 'null'. –

+0

Để công bằng, 'obj = undefined' * nên * giống hệt nhau để bỏ qua một đối số. Bạn nên giải quyết sự khác biệt giữa 'null' và' undefined'. – apsillers

+0

@CrazyTrain Tác giả của ví dụ mã ban đầu đã cố gắng giải thích rằng * trừ khi bạn muốn bảo vệ chống lại 'null' *, không kiểm tra lại'! = Null'. Kiểm tra đối với 'null' được cung cấp (trong trường hợp này) như là một * lỗi * của mã, trong đó ý định thực sự là chỉ để kiểm tra số đối số được xác định. – apsillers

0

Chắc chắn. Trong javascript, bạn có thể có giá trị null và giá trị undefined. Và chúng không giống nhau. Một cách tiếp cận nhanh chóng và dễ dàng để kiểm tra xem arg là hợp lệ có lẽ sẽ là:

if (arg4)

Và bằng cách này bạn kiểm tra arg4 không phải là null, không xác định, và không sai. Vui lòng cẩn thận với điều kiện cuối cùng này, bạn có thể thông báo giá trị sai có ý thức ở đây :-)

CHỈNH SỬA: T.J. Crowder là ngay tại đây. Rất dễ sử dụng và sẽ hoạt động trong hầu hết các trường hợp, nhưng hãy cẩn thận.

+0

Câu trả lời hay nhất, trừ khi arg4 là Boolean :) – EkoostikMartin

+6

* "Cách tốt nhất để kiểm tra xem arg có hợp lệ có thể là" * Không, điều đó cũng sẽ loại bỏ '" "', '0',' NaN' và 'false' (ngoài' null' và 'undefined'). Có rất nhiều lần khi nó sẽ cắn bạn. Đó là một kiểm tra tuyệt vời cho đối số tùy chọn * đối số, nhưng khác với những người, nó được dicey. (Không phải dv của tôi) –

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