Tôi nghĩ rằng cách hiệu quả nhất để kiểm tra "giá trị là null
hoặc undefined
" là
if ( some_variable == null ){
// some_variable is either null or undefined
}
Vì vậy, hai dòng này là tương đương:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Lưu ý 1
Như đã đề cập trong câu hỏi, biến thể ngắn yêu cầu some_variable
đã được khai báo, nếu không thì ReferenceError sẽ bị ném. Tuy nhiên, trong nhiều trường hợp sử dụng, bạn có thể cho rằng điều này là an toàn:
kiểm tra các đối số tùy chọn:
function(foo){
if( foo == null ) {...}
kiểm tra các thuộc tính trên một đối tượng hiện có
if(my_obj.foo == null) {...}
Mặt khác typeof
có thể đối phó với các biến toàn cầu không được khai báo (đơn giản là trả về undefined
). Tuy nhiên, những trường hợp này nên được giảm đến mức tối thiểu vì những lý do chính đáng, như Alsciende giải thích.
Lưu ý 2
Biến thể này - thậm chí ngắn hơn - không tương đương:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
vì thế
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Lưu ý 3
Nói chung nên sử dụng ===
thay vì ==
. Giải pháp đề xuất là một ngoại lệ cho quy tắc này. Các kiểm tra cú pháp JSHint thậm chí cung cấp các eqnull
tùy chọn vì lý do này.
Từ hướng dẫn kiểu jQuery :
Kiểm tra bình đẳng nghiêm ngặt (===) nên được sử dụng có lợi cho ==. Ngoại lệ duy nhất là khi kiểm tra không xác định và null bằng cách null.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
if(some_variable) { ... }
sẽ không thực thi nếusome_variable
làfalse
hoặc0
hoặc ...