Làm cách nào để xác định xem một biến là 'không xác định' hay 'null'?


2130

Làm thế nào để tôi xác định nếu biến là undefinedhay null?

Mã của tôi là như sau:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

Nhưng nếu tôi làm điều này, trình thông dịch JavaScript sẽ dừng thực thi.


Câu trả lời:


2849

Bạn có thể sử dụng các phẩm chất của toán tử đẳng thức trừu tượng để làm điều này:

if (variable == null){
    // your code here.
}

Bởi vì null == undefinedlà đúng, mã trên sẽ bắt cả hai nullundefined.


5
Tôi đang cố kiểm tra xem sự kiện có phải là null trong firefox hay không và lỗi sẽ chặn việc thực thi: "sự kiện không được xác định"
Entretoize

3
@MichaelFever Làm thế nào mà nó không hoạt động? Sao chép dán cái này trong bảng điều khiển của bạn: const y = undefined; y == null;Nó sẽ trở lạitrue
Seraf 18/03/19

2
@ChrisStryczynski Ví dụ từ nhận xét của bạn, bạn tuyên bố ykhông đổi, nhưng bạn so sánh abc(không y). Khi tôi thử nghiệm yqua console.log(y == null);Chrome và Firefox, tôi đã nhận được truekết quả. Nếu bạn gặp lỗi thì có lẽ bạn đã cố gắng sử dụng toán tử gán =thay vì so sánh ==sẽ có nghĩa là trả lại lỗi vì constkhông thể được chỉ định lại.
Pshemo

2
ví dụ trực tiếp của các so sánh có liên quan. lgtm.
Ryan Hained

2
@ZaytsevDmitry tại sao bạn mong đợi một bài kiểm tra nếu một biến là nullhoặc undefinedvượt qua nếu biến bằng 0? Câu hỏi không phải là về việc kiểm tra giá trị trung thực, mà là kiểm tra rõ ràng cho nullhay undefined.
Rodrigo-silveira

1108

Cách tiêu chuẩn để bắt nullundefinedđồng thời là:

if (variable == null) {
     // do something 
}

- trong đó tương đương 100% với rõ ràng hơn nhưng ít súc tích hơn:

if (variable === undefined || variable === null) {
     // do something 
}

Khi viết JS chuyên nghiệp, cần phải có sự bình đẳng kiểu===== đó và hành vi của vs được hiểu. Do đó chúng tôi sử dụng ==và chỉ so sánh với null.


Chỉnh sửa lại

Các ý kiến ​​cho thấy việc sử dụng typeofchỉ đơn giản là sai. Có, giải pháp của tôi ở trên sẽ gây ra ReferenceError nếu biến không tồn tại. Đây là một điều tốt. ReferenceError này là mong muốn: nó sẽ giúp bạn tìm ra lỗi của mình và sửa lỗi trước khi bạn gửi mã, giống như lỗi trình biên dịch trong các ngôn ngữ khác. Sử dụng try/ catchnếu bạn đang làm việc với đầu vào mà bạn không có quyền kiểm soát.

Bạn không nên có bất kỳ tham chiếu nào đến các biến không được khai báo trong mã của mình.


47
Điều này sẽ gây ra một ReferenceError và ngắt thực thi nếu biến không được xác định hoặc được đề cập ở tất cả trong mã, sử dụng typeof sẽ an toàn hơn.
Mani Gandham

56
Đó là nhiều hơn một điểm phong cách. Nếu biến chưa được khai báo tại tất cả , đó là viết thực sự chỉ xấu trên một phần của tác giả. Bạn nên biết liệu biến của bạn đã được khai báo hay chưa, đó không phải là một câu hỏi. Nhưng , nếu vì một lý do nào đó, trường hợp này nên được thay đổi thành window.variable thay vì chỉ biến , điều này sẽ không gây ra lỗi tham chiếu. Typeof nên tránh.
tạm

6
Có bởi vì bạn đã viết !==thay vì !=.
tạm

9
-OP: Tuyên bố về những so sánh đó là "tương đương 100%" là SIMPLY WRONG, như bạn đã lưu ý trong EDIT của chính mình, lần thứ hai sẽ gây ra ReferenceError. Đối với khẳng định: "Bạn không nên có bất kỳ tham chiếu nào đến các biến không được khai báo trong mã của mình." CÓ THẬT KHÔNG? Bạn đã từng nghe về Thông số Tùy chọn chưa? jsfiddle.net/3xnbxfsu
Timothy Kanski

16
Các tham số tùy chọn @TimothyKanski có thể không được xác định nếu chúng không được cung cấp tùy chọn, nhưng chúng là các biến được khai báo chắc chắn nhất. Chúng được khai báo và có giá trị undefined, như bất kỳ biến được khai báo nhưng chưa được khởi tạo nào, nghĩa là, var someVar;đối số của bạn không thực sự giữ vững
chiliNUT

228

Kết hợp các câu trả lời trên, có vẻ như câu trả lời đầy đủ nhất sẽ là:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

Điều này sẽ làm việc cho bất kỳ biến nào không được khai báo hoặc khai báo và được đặt rõ ràng thành null hoặc không xác định. Biểu thức boolean nên ước tính thành false cho bất kỳ biến khai báo nào có giá trị không null thực tế.


2
@Aerovistae Tôi nhận ra rằng đó typeoflà một toán tử, không phải là hàm, vì vậy nó không cần dấu ngoặc đơn, nhưng dù sao tôi cũng đánh giá cao dấu ngoặc đơn - chỉ đơn giản là để đọc rõ ràng.
user664833

1
Điều gì về việc kiểm tra trực tiếp nếu (biến === không xác định) thay vì sử dụng typeof?
Frozen Crayon

2
@ArjunU sẽ gây ra ReferenceError nếu biến không được khai báo. Nếu bạn không biết liệu một biến có được khai báo hay không, hãy sử dụng giải pháp trên. Nếu bạn có thể đảm bảo rằng biến ít nhất được khai báo, bạn có thể sử dụngvariable == null
Rogue

3
Đây là một giải pháp tốt hơn vì như @Rogue đã chỉ ra, biến có thể không được khai báo.
Abdul Sadik Yalcin

Chỉnh sửa cho tôi nếu tôi sai, nhưng không phải là điều kiện đầu tiên thay thế cho điều kiện thứ hai, và do đó điều kiện thứ hai là thừa?
Hồ tháng 3

187
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

14
Chỉ trong trường hợp bất cứ ai nghĩ rằng đây là một nửa câu trả lời, điều này thực sự làm việc. undefinedđánh giá bằng null.
Chuck

3
Thất bại với tôi trong bảng điều khiển chrome ... ReferenceError: biến không được xác định, vì vậy nó có thể hoạt động, nhưng đối với tôi không ...
Eran Medan

48
Nó chỉ hoạt động cho các biến được khai báo, không phải là các biến có thể hoặc không được khai báo, điều này hiếm khi xảy ra. (Bạn cần sử dụng typeof + kiểm tra null cho trường hợp đó)

11
Chỉ cần tìm ra bạn có thể thêm nhận xét này: /*jshint eqnull:true */vào đầu tài liệu hoặc hàm JS của bạn và JSHint sẽ ngừng cảnh báo bạn về việc sử dụng == null.
Web_Designer

3
@Aerovistae bạn có thể chỉ cho tôi một tài liệu tham khảo nói rõ rằng ==nó bị hỏng. Sự ép buộc if(variable == null)trong câu trả lời này hoàn toàn có ý nghĩa với tôi ...
Ben Aston

94
if (typeof EmpName != 'undefined' && EmpName) {

sẽ đánh giá là đúng nếu giá trị không:

  • vô giá trị

  • chưa xác định

  • NaN

  • chuỗi rỗng ("")

  • 0

  • sai


13
Tôi nghĩ rằng đây là một kỹ thuật nguy hiểm đã lan rộng như lửa hoang. Bởi vì rất nhiều biến được kiểm tra có thể là boolean hoặc số. Vì vậy, nếu người dùng không hiểu đầy đủ về hậu quả, điều này là không tốt.
hữu íchBee 20/1/2016

Vui lòng cung cấp một tài liệu tham khảo về đặc quyền javascript này
Villamejia

1
Điều này giống như if (EmpName). Nếu nó undefinedsẽ là giả.
Rudy

1
Nếu biến không được xác định. sau đó nếu (EmpName) sẽ ném lỗi
Thamaraiselvam

1
@Thamaraiselvam Tôi nghĩ Rudy có thể có ý này var EmpName; if (EmpName). Trong đó biến được định nghĩa nhưng không được gán một giá trị.
hungerstar

28

attr()Hàm jQuery trả về một chuỗi trống hoặc giá trị thực (và không bao giờ nullhoặc undefined). Lần duy nhất nó trả về undefinedlà khi bộ chọn của bạn không trả về bất kỳ phần tử nào.

Vì vậy, bạn có thể muốn kiểm tra đối với một chuỗi trống. Ngoài ra, vì các chuỗi trống, null và không xác định là false-y, bạn chỉ có thể làm điều này:

if (!EmpName) { //do something }

1
Chrome 17.0.963.78 m đưa ra lỗi này:ReferenceError: EmpName is not defined
Eran Medan

6
@EranMedan Tôi biết điều này là muộn, nhưng hy vọng nó sẽ giúp những người đến đây sau. Lý do bạn gặp lỗi là vì nó chưa được khai báo. Thông thường, bạn sẽ có EmpName (hoặc một số biến khác) được truyền vào một hàm hoặc giá trị trả về của hàm khác và do đó được khai báo (Ví dụ: "var x;"). Để kiểm tra nếu nó trả về không xác định, hoặc null hoặc chuỗi trống, bạn có thể sử dụng giải pháp trên.
Dave

Tôi nhận ra đây là một câu hỏi lạnh, nhưng jQuery sẽ trả về undefinednếu thuộc tính không tồn tại trên phần tử (không chỉ khi bộ chọn không có phần tử phù hợp, theo câu trả lời). Ví dụ: imgkhông srccó trả lại undefinedcho$('img').attr('src');
mã hóa

20

Tôi đã đến để viết chức năng của riêng tôi cho việc này. JavaScript thật kỳ lạ.

Nó có thể sử dụng trên bất cứ điều gì theo nghĩa đen. (Lưu ý rằng điều này cũng kiểm tra xem biến có chứa bất kỳ giá trị có thể sử dụng nào không . Nhưng vì thông tin này thường cũng cần thiết, tôi nghĩ rằng nó đáng để đăng). Hãy xem xét để lại một ghi chú.

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

Tương thích với TypeScript.


Hàm này sẽ thực hiện chính xác giống như empty()hàm của PHP (xem RETURN VALUES)

Xem xét undefined, null, false, 0, 0.0, "0" {}, []như trống rỗng.

"0.0", NaN, " ", trueĐược coi là không có sản phẩm nào.


2
Tôi đã chạy vào một vấn đề kiểm tra null nhỏ. Tôi muốn kiểm tra xem một tham số được truyền là null hay đối tượng trống { }. Đây là một vấn đề ngôn ngữ phổ biến và ngớ ngẩn, nhưng tôi đã quên nó. Tất cả các tìm kiếm của tôi hiển thị câu trả lời không xác định giá trị null hoặc so sánh đẳng thức lỏng lẻo (==), nhưng không bằng đẳng thức nghiêm ngặt (===) hoặc tương đương. Và sau đó, trong câu trả lời được xếp hạng -1 của bạn ở cuối trang (trước khi tôi nêu lên) là câu trả lời đã lảng tránh tôi. Object.keys( obj ).length < 1hoặc có thể === 0, giả sử nó sẽ không bao giờ là -1. Dù sao, được nâng lên 0, woo. : p

Cảm ơn, tôi đã có thể bỏ chức năng này vào và dọn sạch rất nhiều mã. Tại sao đây không phải là một hàm JS tiêu chuẩn nằm ngoài tôi.
Andy

3
Bạn nên thay đổi tất cả các bạn ==đến ===đây, thì đây sẽ là một chức năng hợp lý.
Ben McIntyre

13

Nếu biến bạn muốn kiểm tra là toàn cục, hãy làm

if (window.yourVarName) {
    // Your code here
}

Cách kiểm tra này sẽ không gây ra lỗi ngay cả khi yourVarNamebiến không tồn tại.

Ví dụ: Tôi muốn biết liệu trình duyệt của tôi có hỗ trợ API Lịch sử không

if (window.history) {
    history.back();
}

Cách thức hoạt động:

windowlà một đối tượng chứa tất cả các biến toàn cục làm thuộc tính của nó và trong JavaScript, việc cố gắng truy cập vào một thuộc tính đối tượng không tồn tại là hợp pháp. Nếu historykhông tồn tại thì window.historytrả về undefined. undefinedlà falsey, vì vậy mã trong một if(undefined){}khối sẽ không chạy.


2
Người đọc cần lưu ý rằng một cách tiếp cận như thế này là thành ngữ để kiểm tra - từ JavaScript chạy trong trình duyệt - liệu một biến toàn cục đã được khai báo hay chưa, và đặc biệt là liệu toàn cầu có cung cấp trình duyệt (như API lịch sử) hay không. Nó sẽ không hoạt động để kiểm tra xem một biến không toàn cầu là nullhay undefined, cũng sẽ không hoạt động nếu JavaScript của bạn đang chạy bên ngoài trình duyệt (tức là trong Node.js). Nó cũng sẽ đối xử với các quả cầu được đặt thành 0, falsehoặc ''giống như các quả cầu không được khai báo undefinedhoặc null, thường là tốt.
Mark Amery

Điều này giả định rằng tập lệnh đang chạy trong trình duyệt. Đó không phải là một cho trước.
GreenAsJade

13

Ngắn nhất và dễ nhất:

if(!EmpName ){
 // DO SOMETHING
}

điều này sẽ đánh giá đúng nếu EmpName là:

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

3
Trường hợp sử dụng ở đây là tôi muốn biết sự khác biệt giữa không xác định và sai. Tôi sẽ sử dụng kiểm tra trên null sau đó.
gast128

12

Có lẽ cách ngắn nhất để làm điều này là:

if(EmpName == null) { /* DO SOMETHING */ };

Đây là bằng chứng:

Và đây là chi tiết về ==(nguồn ở đây )

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

THƯỞNG : lý do tại sao ===rõ ràng hơn ==(nhìn vào câu trả lời agc )

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


9

Tôi vừa gặp vấn đề này, tức là kiểm tra xem một đối tượng có rỗng không.
Tôi chỉ đơn giản là sử dụng cái này:

if (object) {
    // Your code
}

Ví dụ:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
sẽ tốt hơn nếu đặt var A = document.getEuityById ("enterJob") if (A) A. className + = 'current'; Bằng cách này, bạn làm 50% công việc cho cùng một kết quả ... Nhưng có lẽ bạn chỉ làm điều đó cho các chương trình và sau đó tôi chào.
Harry Svensson

8

Vì bạn đang sử dụng jQuery , bạn có thể xác định xem một biến không được xác định hoặc giá trị của nó là null bằng cách sử dụng một hàm duy nhất.

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

Điều này đã không làm việc cho tôi. Tôi vẫn nhận được lỗi: ReferenceError: s is not definedví dụ đầu tiên.
Đánh dấu

6

Phần tử kiểm tra jQuery không null:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

5

Trong JavaScript, theo hiểu biết của tôi, chúng ta có thể kiểm tra một biến không xác định, null hoặc rỗng như bên dưới.

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

Kiểm tra tất cả các điều kiện:

if(variable === undefined || variable === null || variable === ''){
}

varlà một từ dành riêng, điều này sẽ némSyntaxError
dhilt

5

Bạn có thể chỉ cần sử dụng những điều sau đây (tôi biết có những cách ngắn hơn để làm điều này, nhưng điều này có thể giúp quan sát trực quan dễ dàng hơn, ít nhất là đối với những người khác đang xem mã).

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

4

Cách dễ nhất để kiểm tra là:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
Điều này sẽ thực thi mã nếu biến có giá trị false, có khả năng không mong muốn.
byxor

Câu hỏi rất rõ ràng "Làm thế nào để xác định xem biến là 'không xác định' hay 'null'?" và trong javascript nếu một biến có giá trị null hoặc không xác định, giá trị của nó là sai.
M. Arnold

1
Xin lỗi, nhưng điều đó không chính xác. Đây là một JSfiddle để chứng minh điều đó.
byxor

Bằng câu trả lời của bạn undefined, null một vài thứ khác như chuỗi rỗng, +0, -0 NaNfalsevượt qua. !toán tử cưỡng chế toán hạng- tại đây variable- tới Boolean: ecma
Alireza

Nhưng hãy kiểm tra câu hỏi: "Cách xác định xem một biến không xác định hay null", toán hạng được sử dụng với if sẽ luôn trở về true nếu biến là null hoặc không xác định.
M. Arnold

3

Với giải pháp dưới đây:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

Tôi có thể kiểm tra các mục sau:

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

Điều này không trả lời câu hỏi, đó là "làm thế nào để tôi bắt được null và không xác định?" không phải "làm cách nào để tôi nắm bắt mọi giá trị falsey trong JavaScript?"
tạm

@Aerovistae, tôi nghĩ tôi đã làm với console.log (isDeepEqual (null, null)); và console.log (isDeepEqual (không xác định, không xác định)); ?
Tony Tai Nguyễn

2

Để kiểm tra xem một biến là null hay không xác định, tôi sử dụng đoạn mã dưới đây.

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

Đóng nhưng không. Mất typeofvà so sánh với undefinedthẳng ra, không phải là một chuỗi. Điều này hoạt động nhưng toán tử thêm không có tác dụng nhưng để làm cho nó dài hơn.
tạm

Trong trường hợp này, đúng vậy, chúng tôi không cần sử dụng typeof. Nhưng đó là một cách thực hành tốt để sử dụng typeof khi bạn đang xử lý các biến không xác định. Một lý do để sử dụng typeof là nó không đưa ra lỗi nếu biến chưa được khai báo.
DanKodi

Đó thực sự là một điều xấu. Bạn không muốn các biến không được khai báo trong mã của bạn. Bạn muốn điều đó ném ReferenceError để bạn có thể tìm biến và khai báo nó. Chắc chắn bạn sẽ không thử điều đó trong một ngôn ngữ được biên dịch như C ++! Chỉ vì JS cho phép nó không có nghĩa là nó nên được thực hiện.
tạm

1
Tuyên bố của bạn là ngược. Kiểm tra xem một cái gì đó không được xác định sẽ là bước đầu tiên, không phải là thứ hai.
Anthony Rutledge

2

Tôi chạy thử nghiệm này trong bảng điều khiển Chrome. Sử dụng (void 0) bạn có thể kiểm tra không xác định:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

2

Hãy nhìn vào điều này,

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

    Ở trên, biến chỉ được khai báo là apple. Trong trường hợp này, nếu chúng ta gọi phương thức, alertnó sẽ hiển thị không xác định.

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

Trong cái thứ hai, nó hiển thị null, vì biến applegiá trị là null.

Vì vậy, bạn có thể kiểm tra xem một giá trị là không xác định hoặc null.

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}

1

Cách tốt nhất:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}

6
Giải pháp chính xác này đã được @jkindwall cung cấp vào ngày 11 tháng 10 năm 2013. stackoverflow.com/a/19323555/2943403 Bài đăng chỉ có mã này là hoàn toàn vô dụng vì nó không thêm giá trị mới vào trang. Trong thực tế, nó đang thêm phình trang và lãng phí thời gian của các nhà nghiên cứu đọc nó. Hãy loại bỏ câu trả lời này.
mickmackusa

1
(null == undefined)  // true

(null === undefined) // false

Bởi vì === kiểm tra cả loại và giá trị. Loại của cả hai là khác nhau nhưng giá trị là như nhau.


1
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
Điều gì xảy ra nếu người dùng nhập từ 'không xác định'?
Chuck

Câu hỏi của bạn là tốt, nó hiển thị điều kiện là đúng vì vậy chúng ta cần thay đổi tùy chọn bình thường không xác định thành điều kiện typeof. @Chuck
KARTHIKEYAN.A

Cái này sai. typeofsẽ không bao giờ mang lại undefined, chỉ có chuỗi 'undefined'. Hơn nữa, điều i == nullnày đã đúng nếu iundefined, vì vậy boolean thứ hai sẽ là dự phòng ngay cả khi nó hoạt động.
tạm

1
Giải pháp này (với các điều kiện đảo ngược) đã được @jkindwall cung cấp vào ngày 11 tháng 10 năm 2013. stackoverflow.com/a/19323555/2943403 Bài đăng chỉ có mã này hoàn toàn vô dụng vì nó không thêm giá trị mới vào trang. Trong thực tế, nó đang thêm phình trang và lãng phí thời gian của các nhà nghiên cứu đọc nó. Hãy loại bỏ câu trả lời này.
mickmackusa

1

Việc foo == nullkiểm tra cần thực hiện thủ thuật và giải quyết trường hợp "không xác định HOẶC null" theo cách ngắn nhất. (Không xem xét trường hợp "foo không được khai báo".) Nhưng những người đã từng có 3 bằng (như cách thực hành tốt nhất) có thể không chấp nhận nó. Chỉ cần nhìn vào các quy tắc eqeqeq hoặc triple-bằng trong eslint và tslint ...

Cách tiếp cận rõ ràng, khi chúng tôi đang kiểm tra xem một biến là undefinedhay nullriêng biệt, nên được áp dụng trong trường hợp này và đóng góp của tôi cho chủ đề (27 câu trả lời không phủ định bây giờ!) Là sử dụng void 0như một cách ngắn gọn và an toàn để thực hiện kiểm tra cho undefined.

Sử dụng foo === undefinedkhông an toàn vì không xác định không phải là một từ dành riêng và có thể bị che khuất ( MDN ). Sử dụng typeof === 'undefined'kiểm tra là an toàn, nhưng nếu chúng ta không quan tâm đến trường hợp không được khai báo thì có thể sử dụng phương pháp sau:

if (foo === void 0 || foo === null) { ... }

1

nếu bạn tạo một hàm để kiểm tra nó:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

-1

Việc gọi typeof null trả về một giá trị của đối tượng, vì giá trị đặc biệt null được coi là một tham chiếu đối tượng trống. Safari thông qua phiên bản 5 và Chrome đến phiên bản 7 có một sự giải quyết trong đó việc gọi kiểu trên một biểu thức thông thường sẽ trả về hàm hàm Cameron trong khi tất cả các trình duyệt khác trả về đối tượng Hồi.


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

Bạn chỉ có thể sử dụng cái thứ hai: vì nó sẽ kiểm tra cả định nghĩa và khai báo


-1

Tôi vẫn nghĩ cách tốt nhất / an toàn để kiểm tra hai điều kiện này là truyền giá trị thành một chuỗi:

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

bạn có thể giải thích lý do tại sao bạn tin rằng đây là "cách tốt nhất / an toàn" để thực hiện các bài kiểm tra?
sadmic [

Bởi vì chuyển đổi luôn trả về một chuỗi "được tiêu chuẩn hóa" (nghĩa là [đối tượng không xác định]), do đó bạn không gặp rắc rối bằng cách kiểm tra các giá trị giả. Đó chỉ là ý kiến ​​của tôi dựa trên kinh nghiệm tôi có với các giá trị trung thực / giả dối.
n1kkou

Cảm ơn đã giải thích. Tôi không chỉ trích, đó là một câu trả lời thú vị, tôi chỉ muốn bạn cung cấp một số lời giải thích cho người khác về lý do tại sao điều này có khả năng vượt trội so với các phương pháp khác.
sadmic [

Đừng lo lắng! Tôi đã có rất nhiều vấn đề với kiểu so sánh này, và cho đến bây giờ, tôi thấy đó là cách tiếp cận hữu ích nhất cho vấn đề này.
n1kkou

-2

Bạn có thể kiểm tra xem giá trị là không xác định hoặc null bằng cách sử dụng typeof:

if(typeof value == 'undefined'){

Xem bình luận trong câu trả lời trước ( stackoverflow.com/a/21273362/6305294 ) về typeof.
Alex

4
Điều này là không chính xác. Không bắt được null. Tôi không hiểu tại sao câu trả lời mới, không chính xác đang được cung cấp cho một câu hỏi đã được đưa ra một câu trả lời đúng và đầy đủ từ nhiều năm trước. Bạn có cảm thấy câu trả lời hiện tại không đủ?
tạm

-4

if(x==null)là một ý tưởng tồi trong JavaScript. Đánh giá với "=="- nó có thể gây ra một sự ép buộc kiểu không mong muốn và CoffeeScript không thể đọc được, không bao giờ sử dụng "==" hoặc "! =" Trong phán đoán điều kiện!

if(x)sẽ tốt hơn, nhưng hãy cẩn thận với 0 và "" . Nó sẽ được coi là sai , không phải phương thức bằng với "!= null"đúng .

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

Xem Thực tiễn tốt nhất về JavaScript .


3
Điều này là hoàn toàn không chính xác, và nghiên cứu về bất kỳ khuôn khổ hoặc phần mềm cấp chuyên nghiệp nào sẽ chứng minh điều đó trong giây lát. Sử dụng ==để so sánh với nullnhững cách tiêu chuẩn bắt nullundefinedtrong JS. Loại cưỡng chế với ==không phải là một rủi ro trong bối cảnh cụ thể này, và trên thực tế đang bị lợi dụng để hoàn thành mục tiêu bắt cả hai nullundefinedđồng thời. Vui lòng dành nhiều thời gian hơn để làm việc với ngôn ngữ trước khi chọn đưa ra câu trả lời sai và sai cho các câu hỏi đã được giải quyết thỏa đáng từ nhiều năm trước.
tạm

tránh "==". Mọi thứ luôn thay đổi, tôi không đồng ý với bạn @Aerovistae
Albert.Qing

3
Bạn không đồng ý với tôi - bạn không đồng ý với toàn bộ cơ sở JavaScript. Chúng ta hãy rõ ràng.
tạm
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.