2010-09-01 9 views
7

Tôi thường thấy mã JavaScript nơi một chức năng có thể mất trong một "lựa chọn" đối tượng và sử dụng nó như:JavaScript không xác định kiểm tra

var name = typeof options.name !== 'undefined' ? options.name : "Bob"; 

Điều này có vẻ như nó sẽ tương đương như sau:

var name = options.name || "Bob"; 

Bây giờ, tôi hiểu rằng trong một số trường hợp, bạn có thể thực sự quan tâm rằng options.nameundefinednull và điều này có ý nghĩa với tôi, nhưng tôi thường thấy điều này trong những trường hợp không phân biệt này.

Tôi tin rằng tôi đã nghe nói rằng mọi người viết mã như thế này vì một số lỗi trong IE. Ai đó có thể xây dựng được không?

Trả lời

6

Tôi không nhận thức được lỗi trong IE, nhưng những báo cáo không chính xác tương đương:

  • Người đầu tiên đặt biến name để mặc định "Bob" chỉ khi options.nameundefined.

  • Biến thứ hai đặt biến số name thành "Bob" bất cứ khi nào options.name bị lỗi. Đây có thể là một chuỗi rỗng, giá trị null, giá trị là 0, giá trị NaN, giá trị boolean false và cũng là undefined.

Ví dụ, nếu options.name === 0, báo cáo kết quả đầu tiên sẽ đặt biến name-0, trong khi báo cáo kết quả thứ hai sẽ đặt nó vào "Bob".

2

Tôi hy vọng nó sẽ phụ thuộc vào những gì nhà phát triển thực sự có ý định làm thay vì bất kỳ quy ước nào họ đăng ký. Trong nhiều trường hợp, ngắn hơn name = options.name || "Bob"; có thể kết thúc mang lại cho bạn giá trị bạn không mong đợi nếu bạn không biết hành vi thực tế của nó vì nó ràng buộc giá trị boolean ra khỏi options.name. Trong các trường hợp khác, các giá trị "sai" khác sẽ là không thể (hoặc gần như không thể): nếu giá trị sắp ra khỏi phần tử biểu mẫu, bạn không thực sự cần phải lo lắng về undefined, null, false hoặc 0 - nên luôn luôn là một chuỗi miễn là phần tử biểu mẫu tồn tại - vì vậy kiểm tra này sẽ làm gì là đảm bảo rằng trường không phải là một chuỗi trống (mặc dù bất kỳ không gian màu trắng nào cũng sẽ đi qua). Một mẫu phổ biến khác tương tự như options.name || "Bob"if (options.name) {...}, có cùng các vấn đề/lợi ích tiềm ẩn.