JavaScript kiểm tra null so với không xác định và sự khác biệt giữa == và ===


579
  1. Làm cách nào để kiểm tra một biến nếu nó nullhoặc undefinedvà sự khác biệt giữa nullvà là undefinedgì?

  2. Sự khác biệt giữa =====(thật khó để tìm kiếm Google cho "===")?


10
2. Sự khác biệt giữa =====được mô tả tốt ở đây .
Uzbekjon

1. Sử dụng === Thay vì == JavaScript sử dụng hai loại toán tử đẳng thức khác nhau: === | ! == và == | ! = Nó được coi là thực hành tốt nhất để luôn luôn sử dụng bộ trước đây khi so sánh. "Nếu hai toán hạng có cùng loại và giá trị, thì === tạo đúng và! == tạo sai." - JavaScript: Các bộ phận tốt Tuy nhiên, khi làm việc với == và! =, Bạn sẽ gặp vấn đề khi làm việc với các loại khác nhau. Trong những trường hợp này, họ sẽ cố gắng ép buộc các giá trị, không thành công. code.tutsplus.com/tutorials/ từ
jasonleonhard

4
Bạn có thể tìm kiếm Google cho: "nhà điều hành bình đẳng nghiêm ngặt" - lấy kết quả rất phù hợp
Danield

Chỉ cần thêm vào nhiều câu trả lời ở đây là bạn có thể sử dụng hàm lodash.com/docs#isNil để kiểm tra xem biến là null hay không xác định
Kfir Erez

Câu trả lời:


936

Làm cách nào để kiểm tra một biến nếu nó nullhoặc undefined...

Là biến null:

if (a === null)
// or
if (a == null) // but see note below

... nhưng lưu ý điều sau cũng sẽ đúng nếu aundefined.

Là nó undefined:

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below

... nhưng một lần nữa, lưu ý rằng cái cuối cùng là mơ hồ; nó cũng sẽ đúng nếu anull.

Bây giờ, mặc dù ở trên, cách thông thường để kiểm tra những thứ đó là sử dụng thực tế rằng chúng là chim ưng :

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `NaN`, and [of course] `false`)
}

Điều này được xác định bởi ToBoolean trong thông số kỹ thuật.

... Và sự khác biệt giữa nullvà là undefinedgì?

Cả hai giá trị thường được sử dụng để chỉ sự vắng mặt của một cái gì đó. undefinedlà một biến chung hơn, được sử dụng làm giá trị mặc định của các biến cho đến khi chúng được gán một số giá trị khác, làm giá trị của các đối số hàm không được cung cấp khi hàm được gọi và là giá trị bạn nhận được khi bạn hỏi một đối tượng đối với một tài sản nó không có. Nhưng nó cũng có thể được sử dụng rõ ràng trong tất cả các tình huống đó. (Có sự khác biệt giữa một đối tượng không có thuộc tính và có thuộc tính có giá trị undefined; có sự khác biệt giữa việc gọi hàm với giá trị undefinedcho đối số và loại bỏ hoàn toàn đối số đó.)

nullcụ thể hơn một chút so với undefined: Đó là một tham chiếu đối tượng trống. Tất nhiên, JavaScript được gõ một cách lỏng lẻo, nhưng không phải tất cả những thứ mà JavaScript tương tác với đều được gõ một cách lỏng lẻo. Nếu một API như DOM trong các trình duyệt cần một tham chiếu đối tượng đó là trống, chúng tôi sử dụng null, không phải undefined. Và tương tự, getElementByIdhoạt động của DOM trả về một tham chiếu đối tượng - hoặc là một tham chiếu hợp lệ (nếu nó tìm thấy phần tử DOM) hoặc null(nếu nó không).

Thật thú vị (hoặc không), chúng là loại riêng của chúng. Có thể nói, nulllà giá trị duy nhất trong loại Null và undefinedlà giá trị duy nhất trong loại Không xác định.

Sự khác biệt giữa "==" và "==="

Sự khác biệt duy nhất giữa chúng là ==loại cưỡng chế để cố gắng làm cho các giá trị khớp với nhau và ===sẽ không. Vì vậy, ví dụ "1" == 1là đúng, bởi vì "1"ép buộc 1. Nhưng "1" === 1sai , vì các loại không khớp. ( "1" !== 1là đúng.) Bước đầu tiên (thực) ===là "Các loại toán hạng có giống nhau không?" và nếu câu trả lời là "không", kết quả là false. Nếu các loại là giống nhau, nó làm chính xác những gì ==làm.

Loại cưỡng chế sử dụng các quy tắc khá phức tạp và có thể có kết quả đáng ngạc nhiên (ví dụ, "" == 0là đúng).

Thêm trong thông số kỹ thuật:


122
Để chắt lọc câu trả lời của TJ, === có nghĩa là giá trị VÀ loại giống nhau.
Slappy

13
@Slappy: :-) @ MUG4N: Vâng, đúng vậy. if (a) { ... }sẽ có nghĩa là "nếu alà sự thật", trong đó "sự thật" là một giá trị khác không, không rỗng, không xác định, không sai, không rỗng. :-)
TJ Crowder

4
Ừm ... liệu người dùng downvoter có muốn chia sẻ một số phản hồi hữu ích về lý do tại sao bạn nghĩ rằng điều này "không hữu ích" (để trích dẫn chú giải công cụ của nút downvote) không?
TJ Crowder

2
@ Eljko: Tôi nghĩ Crockford có thể bị nhầm lẫn về điểm này. Đúng nulllà không phải là một đối tượng , nó là một tham chiếu đối tượng có nghĩa là "không có đối tượng". Điều này rất quan trọng, bởi vì đó là những gì được sử dụng với các giao diện do máy chủ cung cấp khi chúng cung cấp các tham chiếu đối tượng nhưng không có cái nào để cung cấp (ví dụ: node.nextSiblingkhi nào nodelà phần tử cuối cùng trong cha mẹ của nó hoặc getElementByIdkhi không có phần tử nào có ID đó). Công nghệ mà máy chủ sử dụng cho việc này có thể không linh hoạt như JavaScript về các loại biến / thuộc tính, do đó cần phải có một nullobj ref (trái ngược với undefined).
TJ Crowder

2
Tôi phải đồng ý rằng Crockford đã nhầm. typeof nulltrả lại "đối tượng" có ý nghĩa. Giá trị duy nhất khác có ý nghĩa sẽ là "null", vì nó chắc chắn sẽ trả về một cái gì đó khác với typeof undefined. null đại diện cho một tham chiếu đối tượng null, ít nhất, có nghĩa là biến giữ nó có nghĩa là đối với một số loại 'đối tượng'. Nếu đó là một sai lầm, đó là một sai lầm tốt. Dù sao, liên quan đến câu trả lời, mẹo về undefined! == undefinedtrong quá trình tạo kịch bản chéo cửa sổ là điều tốt để biết, đặc biệt là cho mục đích gỡ lỗi.
Triynko

93

Sự khác biệt là tinh tế.

Trong JavaScript, một undefinedbiến là một biến mà chưa bao giờ được khai báo hoặc không bao giờ được gán một giá trị. Giả sử bạn khai báo var a;chẳng hạn, sau đó asẽ được undefined, bởi vì nó không bao giờ được gán bất kỳ giá trị nào.

Nhưng nếu bạn sau đó chỉ định a = null;thì abây giờ sẽ được null. Trong JavaScript nulllà một đối tượng (hãy thử typeof nulltrong bảng điều khiển JavaScript nếu bạn không tin tôi), điều đó có nghĩa là null là một giá trị (thực tế thậm chí undefinedlà một giá trị).

Thí dụ:

var a;
typeof a;     # => "undefined"

a = null;
typeof null;  # => "object"

Điều này có thể chứng minh hữu ích trong các đối số chức năng. Bạn có thể muốn có một giá trị mặc định, nhưng coi null là chấp nhận được. Trong trường hợp bạn có thể làm:

function doSomething(first, second, optional) {
    if (typeof optional === "undefined") {
        optional = "three";
    }
    // do something
}

Nếu bạn bỏ qua optionaltham số doSomething(1, 2) thentùy chọn sẽ là "three"chuỗi nhưng nếu bạn vượt qua doSomething(1, 2, null)thì tùy chọn sẽ là null.

Đối với các bộ so sánh bằng nhau ==và hoàn toàn bằng nhau ===, cái đầu tiên là loại yếu, trong khi bằng nhau cũng kiểm tra loại giá trị. Điều đó có nghĩa là 0 == "0"sẽ trở lại đúng sự thật; while 0 === "0"sẽ trả về false, vì một số không phải là một chuỗi.

Bạn có thể sử dụng các toán tử để kiểm tra giữa undefinedmột null. Ví dụ:

null === null            # => true
undefined === undefined  # => true
undefined === null       # => false
undefined == null        # => true

Trường hợp cuối cùng rất thú vị, vì nó cho phép bạn kiểm tra xem một biến là không xác định hoặc null và không có gì khác:

function test(val) {
    return val == null;
}
test(null);       # => true
test(undefined);  # => true

1
Kyle Simpson tuyên bố typeof null trả về "đối tượng" là một lỗi: github.com/getify/You-Dont-Know-JS/blob/master/
mẹo

15

Thông số kỹ thuật là nơi để trả lời đầy đủ cho những câu hỏi này. Đây là một bản tóm tắt:

  1. Đối với một biến x, bạn có thể:

    • kiểm tra xem nó nullbằng cách so sánh trực tiếp bằng cách sử dụng ===. Thí dụ:x === null
    • kiểm tra xem nó undefinedbằng một trong hai phương pháp cơ bản: so sánh trực tiếp với undefinedhoặc typeof. Vì nhiều lý do , tôi thích typeof x === "undefined".
    • kiểm tra xem đó có phải là một trong nullundefinedbằng cách sử dụng ==và dựa vào các quy tắc cưỡng chế hơi phức tạp có nghĩa là x == nullthực hiện chính xác những gì bạn muốn hay không.

  2. Sự khác biệt cơ bản giữa =====là nếu các toán hạng có các loại khác nhau, ===sẽ luôn trả về falsetrong khi ==sẽ chuyển đổi một hoặc cả hai toán hạng thành cùng loại bằng cách sử dụng các quy tắc dẫn đến một số hành vi hơi không trực quan. Nếu các toán hạng có cùng loại (ví dụ cả hai là các chuỗi, chẳng hạn như trong typeofso sánh ở trên) =====sẽ hoạt động giống hệt nhau.

Đọc thêm:


9

Làm cách nào để kiểm tra một biến nếu nó không hoặc không xác định

chỉ cần kiểm tra xem một biến có giá trị hợp lệ như thế này không:

if(variable)

nó sẽ trả về true nếu biến không chứa:

  • vô giá trị
  • chưa xác định
  • 0
  • sai
  • "" (một chuỗi trống)
  • NaN

8

chưa xác định

Nó có nghĩa là biến chưa được intialized.

Thí dụ :

var x;
if(x){ //you can check like this
   //code.
}

bằng (==)

Nó chỉ kiểm tra giá trị bằng với không phải kiểu dữ liệu.

Thí dụ :

var x = true;
var y = new Boolean(true);
x == y ; //returns true

Bởi vì nó chỉ kiểm tra giá trị.

Bằng nghiêm ngặt (===)

Kiểm tra giá trị và kiểu dữ liệu phải giống nhau.

Thí dụ :

var x = true;
var y = new Boolean(true);
x===y; //returns false.

Bởi vì nó kiểm tra kiểu dữ liệu x là kiểu nguyên thủy và y là đối tượng boolean.


4

Quảng cáo 1. nullkhông phải là định danh cho một thuộc tính của đối tượng toàn cầu, giống như undefined có thể là

Quảng cáo 2. Các ===giá trị và loại kiểm tra. Không ==yêu cầu cùng loại và thực hiện chuyển đổi ngầm trước khi so sánh (sử dụng .valueOf().toString()). Ở đây bạn có tất cả ( src ):

nếu

nhập mô tả hình ảnh ở đây

== (phủ định của nó ! = )

nhập mô tả hình ảnh ở đây

=== (phủ định của nó ! == )

nhập mô tả hình ảnh ở đây


1
thật đáng để đề cập đến điều đó document.all == nulldocument.all !== null
một người dùng

1

Nếu kiểm tra (logic) của bạn là phủ định (!) Và bạn muốn nắm bắt cả JS nullundefined (vì các Trình duyệt khác nhau sẽ cho bạn kết quả khác nhau), bạn sẽ sử dụng phép so sánh ít hạn chế hơn: vd:

var ItemID = Item.get_id();
if (ItemID != null)
{
 //do stuff
}

Điều này sẽ nắm bắt cả hai nullundefined


0

Hãy thử với logic khác nhau . Bạn có thể sử dụng mã dưới đây để kiểm tra tất cả bốn (4) điều kiện để xác thực như không null, không trống, không xác định và không zero chỉ sử dụng mã này (! (! (Biến))) trong javascript và jquery.

function myFunction() {
var data;  //The Values can be like as null, blank, undefined, zero you can test

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}

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.