Câu hỏi Làm thế nào để xác định nếu biến là 'undefined' hoặc 'null'?


Làm cách nào để xác định xem biến có phải là undefined hoặc là null? Mã của tôi 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ẽ tạm dừng thực thi.


1610
2018-04-15 18:12


gốc


Chúng tôi có thể đề cử câu hỏi này bị khóa không? Tôi không có đủ đại diện. @tats_innit - Aerovistae
@Aerovistae chỉ người kiểm duyệt kim cương <> có thể khóa và mở khóa bài đăng stackoverflow theo cách thủ công: meta.stackexchange.com/questions/22228/…  :) - Tats_innit


Các câu trả lời:


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

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

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


2201
2018-04-15 18:14



if (typeof variable === 'undefined' || !variable) { /* do things */ }; điều này làm việc cho tôi - Ansd
@ Ansd giải pháp của bạn không độc quyền đối với undefined hoặc là null. !variable sẽ là đúng đối với bất kỳ giá trị giả nào: '', 0, false, null, undefined, v.v. - Douglas Ludlow
Có giải thích cho lý do tại sao '==' hoạt động và '===' không? Tôi đã xem xét các chủ đề chỉnh sửa trong meta, nhưng tôi không hiểu tại sao câu trả lời này không thể được hưởng lợi từ một giải thích về lý do tại sao '==' được sử dụng ở đây và cách thức hoạt động của nó. - LucyMarieJ
Tôi đã trả lời câu hỏi của riêng tôi. Xin lỗi. Tôi tìm thấy câu trả lời ở đây: stackoverflow.com/questions/5101948/…  Đối với bất cứ ai có cùng một sự nhầm lẫn. - LucyMarieJ
Có bất kỳ trình duyệt cũ nào mà điều này có thể không thành công không? - donquixote


Cách tiêu chuẩn để bắt null và undefined đồng thời là điều này:

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

- 100% tương đương với chi tiết 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, nó được cho là được cấp rằng [loại bình đẳng và hành vi của == so với ===] [1] được hiểu. Vì vậy 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 typeof đơn giản sai rồi. Có, giải pháp của tôi ở trên sẽ gây ra một 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 những sai lầm của bạn và sửa chúng trước khi bạn gửi mã của bạn, giống như lỗi trình biên dịch sẽ bằng các ngôn ngữ khác.

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


911
2018-01-22 03:01



Điều này sẽ gây ra một ReferenceError và thực hiện phá vỡ nếu biến không được định nghĩa hoặc được nhắc đến ở tất cả trong mã, sử dụng typeof là an toàn hơn. - Mani Gandham
Đó 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ả các, đó thực sự chỉ là viết 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 Vâng, Nếu cho một số lý do đó là trường hợp, điều này sẽ được thay đổi thành window.variable Thay vì chỉ biến, sẽ không gây ra lỗi tham chiếu. Loại bỏ nên tránh. - Aerovistae
Có bởi vì bạn đã viết !== thay vì !=. - Aerovistae
-OP: Các tuyên bố về những so sánh được "100% tương đương" là SIMPLY WRONG, như bạn đã lưu ý trong EDIT của riêng bạn, thứ hai sẽ gây ra một ReferenceError. Đối với xác nhận: "Bạn không nên có bất kỳ tham chiếu nào đến các biến chưa khai báo trong mã của bạn". CÓ THẬT KHÔNG? Bao giờ nghe nói về tham số tùy chọn? jsfiddle.net/3xnbxfsu - Timothy Kanski
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 nhất định là các biến được khai báo. Chúng được khai báo và có giá trị undefined, như bất kỳ biến nào được khai báo nhưng chưa được khởi tạo, tức là var someVar; để đối số của bạn không thực sự nắm giữ - chiliNUT


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

177
2018-04-15 18:25



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ự không hoạt động. undefined đánh giá bằng null. - Chuck
Không thành công với tôi trong bảng điều khiển chrome ... Tham chiếuGỗi: biến không được xác định, do đó nó có thể hoạt động, nhưng không phải cho tôi ... - Eran Medan
Nó chỉ hoạt động cho các biến được khai báo, không phải các biến có thể hoặc không thể được khai báo, mà hiếm khi xảy ra. (Bạn cần phải sử dụng typeof + một kiểm tra null cho trường hợp đó)
Chỉ tìm ra bạn có thể thêm nhận xét này: /*jshint eqnull:true */ ở đầ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
@Aerovistae bạn có thể chỉ cho tôi một tham chiếu nói rõ rằng == bị phá vỡ. Các cưỡng chế if(variable == null) trong câu trả lời này có ý nghĩa hoàn toàn đối với tôi ... - Ben


Kết hợp các câu trả lời ở trên, có vẻ như câu trả lời hoàn chỉnh 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 là không 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 đánh giá sai cho bất kỳ biến khai báo nào có giá trị không null thực tế.


162
2017-10-11 17:02



@Aerovistae Tôi nhận ra rằng typeof là một toán tử, không phải là một hàm, do đó, nó không cần các dấu ngoặc đơn, nhưng tôi đánh giá cao các dấu ngoặc đơn - dù chỉ đơn giản là để đọc rõ ràng. - user664833
những gì về trực tiếp kiểm tra nếu (biến === undefined) thay vì sử dụng typeof? - Arjun U.
@ArjunU sẽ gây ra một ReferenceError nếu biến không được khai báo. Nếu bạn không biết có hay không một biến được khai báo, hãy sử dụng giải pháp trên. Nếu bạn có thể đảm bảo rằng biến được khai báo ít nhất, bạn có thể sử dụng variable == null - Rogue
Đây là giải pháp tốt hơn vì vì @Rogue đã chỉ ra, biến có thể không được khai báo. - Abdul Sadik Yalcin
Sửa tôi nếu tôi sai, nhưng không phải là người đầu tiên có điều kiện là siêu người thứ hai, và do đó điều kiện thứ hai là không cần thiết? - March Ho


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

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

  • vô giá trị

  • chưa xác định

  • NaN

  • chuỗi rỗng ("")

  • 0

  • sai


75
2018-05-07 07:24



Tôi nghĩ đây là một kỹ thuật nguy hiểm đã lan rộng như lửa hoang dã. 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 hoàn toàn hiểu được hậu quả, điều này là không tốt. - usefulBee
Vui lòng cung cấp tham chiếu về tính năng especification javascript này - villamejia
Điều này cũng giống như if (EmpName). Nếu đó là undefined sẽ bị thất bại rồi. - Rudy
Nếu biến không được xác định. sau đó nếu (EmpName) sẽ ném lỗi - Thamaraiselvam
@Thamaraiselvam Tôi nghĩ Rudy có thể có ý nghĩa này var EmpName; if (EmpName). Trong trường hợp biến được xác định nhưng không được gán giá trị. - hungerstar


jQuery attr() hàm trả về một chuỗi trống hoặc giá trị thực tế (và không bao giờ null hoặc là undefined). Thời gian duy nhất nó trả về undefined là khi bộ chọn của bạn không trả lại 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à undefined là false-y, bạn chỉ có thể thực hiện điều này:

if (!EmpName) { //do something }

20
2018-04-15 18:20



Chrome 17.0.963.78 m cung cấp lỗi này: ReferenceError: EmpName is not defined - Eran Medan
@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 này. 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 chuyển vào một hàm, hoặc giá trị trả về của một hàm khác và do đó được khai báo (Ví dụ: "var x;"). Để kiểm tra nếu nó trả về undefined, 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 thích sử dụng điều này:

if (!!variable) {
   //do something
}

Nó bắt cả hai vô giá trị và chưa xác định


13
2017-09-16 08:35



!! trả về false cho null hoặc là undefined. Vì vậy, điều này nếu sẽ chỉ chạy nếu biến không phải là null hoặc không xác định. - Dan
var d = 0; sẽ thất bại !!d đánh giá sai - ainesophaur
Điều này cũng "bắt" chuỗi rỗng, 0, NaNvà false. Câu trả lời hoàn toàn không chính xác. - Aerovistae
Được bình chọn bởi vì câu trả lời này đang gây độc cho nhóm kiến ​​thức StackOverflow. - mickmackusa


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

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

Cách này để kiểm tra sẽ không ném một lỗi ngay cả khi yourVarName biế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 hoạt động:

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


9
2018-02-10 16:30



Người đọc nên lưu ý rằng cách tiếp cận như thế này là thành ngữ để kiểm tra - từ JavaScript đang chạy trong trình duyệt - cho dù toàn cầu biến đã được khai báo và đặc biệt là liệu một trình duyệt toàn cầu được cung cấp (như API lịch sử) có sẵn hay không. Nó sẽ không làm việc để kiểm tra xem biến không phải là toàn cục có phải là null hoặc là undefinedvà cũng không hoạt động nếu JavaScript của bạn đang chạy bên ngoài trình duyệt (ví dụ: trong Node.js). Nó cũng sẽ xử lý các hình cầu được đặt thành 0, false hoặc là '' giống như những người không khai báo hoặc undefined hoặc là 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. - GreenAsJade