kiểm tra javascript không null


132

Dưới đây là một đoạn mã, nơi chúng tôi lấy một giá trị biểu mẫu. Trước khi tiếp tục xử lý kiểm tra nếu giá trị không null ..

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

Bất cứ ý tưởng tại sao nó xảy ra như vậy .. ??


2
CW đã xảy ra vì hơn 6 người dùng đã chỉnh sửa câu hỏi.
BẠN

! == thay vì! =
GetBackerZ

Câu trả lời:


78

Đó là bởi vì val không phải null, nhưng chứa 'null'dưới dạng một chuỗi.

Hãy thử kiểm tra với 'null'

if ('null' != val)

Để được giải thích về thời điểm và lý do tại sao điều này hoạt động, xem chi tiết dưới đây .


2
nên là nếu (null! = val) bằng cách nào đó nó không hoạt động với dấu ngoặc kép
Ananda

Mr.x trong câu hỏi, null là chuỗi ... trường hợp của bạn có thể khác
Arsen Mkrtchyan

145

điều này sẽ giúp bạn

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

22
trong khi về mặt kỹ thuật thì nó hoạt động, một nhân đôi không (!!) là một giả lập trình. Nó thực sự tương đương với if(val), rõ ràng hơn nhiều để đọc. Tôi sẽ tuân theo điều đó (fyi Ujwal, !! val nên hoạt động về mặt kỹ thuật trong C hoặc C ++) xem ở đây để biết các giá trị 'tính trung thực' của javascript: janosch.woschitz.org/javascript-equality-comparison
Will Buck

2
làm thế nào nếu if (! Boolean (val))
thedjaney

1
!! chỉ là một phủ định kép, vì vậy nó có nghĩa đen là if (val.exists). Tôi vẫn thích vẻ ngoài của nó!
Kurai Bankusu

12
điều này sẽ thất bại nếu val = 0kể từ khi !!0đánh giá thành sai
punkrockpolly

3
Đó không phải là một tiêu cực kép đơn giản. Đó là một âm đôi. Về cơ bản, bạn đang chuyển đổi biến thành một boolean. Có nhiều điều để nói về đề tài này nhưng nó đủ để nói rằng trong trường hợp biến của bạn là 0, false, null, undefinedhoặc một số giá trị như vậy mà giải quyết để truecó một!, Bạn sẽ có được falsecho !!. Nó nên được sử dụng một cách tiết kiệm nếu có.
Guy Passy

83

Có 3 cách để kiểm tra "không null". Đề nghị của tôi là sử dụng Strict Not Version.

1. Nghiêm không phải phiên bản

if (val !== null) { ... }

Phiên bản không nghiêm ngặt sử dụng "Thuật toán so sánh bình đẳng nghiêm ngặt" http: //www.ecma-i Intl.org/ecma-262/5.1/#sec-11.9.6 . Các !==có hiệu suất nhanh hơn, so với các !=nhà khai thác vì Strict Bình đẳng So sánh thuật toán không định kiểu giá trị.

2. Không nghiêm ngặt Không phải phiên bản

if (val != 'null') { ... }

Phiên bản không nghiêm ngặt sử dụng "Thuật toán so sánh bình đẳng trừu tượng" http: //www.ecma-i Intl.org/ecma-262/5.1/#sec-11.9.3 . Nó !=có hiệu suất chậm hơn so với !==toán tử vì các giá trị đánh giá thuật toán so sánh bằng thuật toán trừu tượng.

3. Phiên bản không gấp đôi

if (!!val) { ... }

Phiên bản Double Not !!có hiệu suất nhanh hơn so với cả Phiên bản không nghiêm ngặt !==và Phiên bản không nghiêm ngặt !=( https://jsperf.com/tfm-not-null/6 ). Tuy nhiên, nó sẽ đánh máy các giá trị "Falsey" như undefinedNaNthành Sai ( http: //www.ecma-i Intl.org/ecma-262/5.1/#sec-9.2 ) có thể dẫn đến kết quả không mong muốn và nó có khả năng đọc kém hơn vì nullkhông được tuyên bố rõ ràng.


Nó rất kỳ quặc. !!vallàm việc cho tôi nhưng val!==nullkhông có. Tại sao lại như vậy?
TheLogicGuy

@TheLogicGuy - Kiểu dữ liệu của là valgì? console.log(typeof val).
tfmontague

con số. mã loại bỏ các giá trị "xấu" khỏi mảng (null, 0, v.v.). Đây là mã: pastebin.com/L7Z1BtuL
TheLogicGuy

1
@TheLogicGuy - Vấn đề thực tế của bạn không liên quan gì đến null. NaN không lọc chính xác - điều đó sẽ luôn trả về đúng. Điều này sẽ hoạt động :! (IsNaN (val) && (typeof val! == "không xác định")). Trong Javascript có một khái niệm gọi là "Truthy" và "Falsey". Toán tử double-not !!sẽ loại bỏ nhiều hơn chỉ null. Nó sẽ chuyển đổi NaNundefinedthành sai. Và đó là lý do tại sao mảng của bạn lọc chính xác khi sử dụng toán tử kép !!.
tfmontague

30

Sử dụng !==như !=sẽ đưa bạn vào một thế giới kỳ lạ của bảng chân lý JavaScript không truyền tải.


Trừ khi bạn muốn kiểm tra cụ thể undefinedhoặc null. Trong trường hợp đó val != nullsẽ trở lại truecho undefinedhay nullnhưng không cho các giá trị falsey khác như 0.
Eric H

8

Bạn nên sử dụng not equalstoán tử so sánh nghiêm ngặt !==để nếu người dùng nhập liệu "null"thì bạn sẽ không nhận được else.


1
Susan Null sẽ không vui nếu tên của cô không được chấp nhận trong biểu mẫu nhập dữ liệu lol
Andez

5

Có thể là vì giá trị valthực sự là chuỗi "null"chứ không phải giá trị null.


3

Điều này sẽ làm việc tốt ..

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }

2

Nếu bạn muốn có thể bao gồm 0 làm giá trị hợp lệ:

if (!!val || val === 0) { ... }

1

Điều này sẽ làm việc:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.