Cách kiểm tra biến không xác định trong JavaScript


913

Tôi muốn kiểm tra xem biến có được xác định hay không. Ví dụ, sau đây ném một lỗi không xác định

alert( x );

Làm thế nào tôi có thể bắt lỗi này?



5
Có vẻ như đây là một granddaddy: stackoverflow.com/questions/1485840/ Khăn stackoverflow.com/questions/2647867/ Kẻ - gramp tuyệt vời có thể này: stackoverflow.com/questions/27509/,
ngẫu nhiên

1
Đây không phải là một bản sao của bản sao được đánh dấu. Độ phân giải biến và độ phân giải thuộc tính đối tượng là những thứ rất khác nhau. Một bản sao tốt hơn là làm thế nào để kiểm tra xem một biến có tồn tại trong javascript không? .
RobG

Lỗi của bạn là do biến không được khai báo. Hầu hết các câu trả lời được tập trung vào bài tập. Xem câu trả lời của tôi để biết thêm. Ngoài ra, nhiều trong số chúng nói không chính xác rằng null và không xác định là các đối tượng trong JavaScript. Chúng là nguyên thủy , không phải đồ vật ...
JBallin

Câu trả lời:


1690

Trong JavaScript, nulllà một đối tượng. Có một giá trị khác cho những thứ không tồn tại , undefined. DOM trả về nullcho hầu hết các trường hợp không tìm thấy cấu trúc nào đó trong tài liệu, nhưng trong chính JavaScript undefinedlà giá trị được sử dụng.

Thứ hai, không, không có tương đương trực tiếp. Nếu bạn thực sự muốn kiểm tra cụ thể null, hãy làm:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Nếu bạn muốn kiểm tra xem một biến có tồn tại hay không, điều đó chỉ có thể được thực hiện với try/ catch, vì typeofsẽ xử lý một biến không được khai báo và một biến được khai báo với giá trị undefinedlà tương đương.

Nhưng, để kiểm tra xem một biến có được khai báo hay không undefined:

if (yourvar !== undefined) // Any scope

Trước đây, cần phải sử dụng typeoftoán tử để kiểm tra không xác định một cách an toàn, bởi vì có thể gán lại undefinedgiống như một biến. Cách cũ trông như thế này:

if (typeof yourvar !== 'undefined') // Any scope

Vấn đề về undefinedviệc có thể gán lại đã được khắc phục trong ECMAScript 5, được phát hành vào năm 2009. Bây giờ bạn có thể sử dụng một cách an toàn ===!==kiểm tra undefinedmà không sử dụng typeofnhư undefinedđã được đọc trong một thời gian.

Nếu bạn muốn biết liệu một thành viên tồn tại độc lập nhưng đừng quan tâm giá trị của nó là gì:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Nếu bạn muốn biết liệu một biến có trung thực hay không :

if (yourvar)

Nguồn


71
không xác định không phải là một từ dành riêng; bạn (hoặc mã của người khác) có thể thực hiện "không xác định = 3" và điều đó sẽ phá vỡ hai bài kiểm tra của bạn.
Jason S

6
"Nếu bạn biết biến tồn tại nhưng không biết có giá trị nào được lưu trong đó không" - huh?!
Jason S

36
Tôi nghĩ rằng anh ta đang đề cập đến một biến được tuyên bố chưa được chỉ định. ví dụ: var foo; // foo tồn tại nhưng không có giá trị
Wally Lawless

3
Hmmm ... Tôi chỉ nhận thấy liên kết "nguồn": toàn bộ bài đăng này là một trích dẫn trực tiếp từ danh sách gửi thư, và có lẽ nên được chỉnh sửa để làm cho rõ ràng hơn, vì tác giả ban đầu không có sẵn để làm rõ.
Jason S

11
"Trong JavaScript null là một đối tượng.", Điều đó không thực sự đúng và có lẽ, thủ phạm của quan niệm sai lầm này là typeoftoán tử ( typeof null == 'object'). Các nullgiá trị là một giá trị nguyên thủy , mà là giá trị duy nhất của loại Null .
CMS

347

Cách duy nhất để thực sự kiểm tra nếu một biến là undefinedlàm như sau. Hãy nhớ rằng, không xác định là một đối tượng trong JavaScript.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Một số giải pháp khác trong luồng này sẽ khiến bạn tin rằng một biến không được xác định ngay cả khi nó đã được xác định (ví dụ với giá trị NULL hoặc 0).


18
Bởi vì câu hỏi KHÔNG ĐƯỢC HIỂU Ở đây nên nên gõ một sốVar! == 'không xác định', phải không?
eomeroff

1
Thực sự, tôi không nghĩ rằng không xác định là một đối tượng, hãy kiểm tra tài liệu đầu tiên của nhà phát
triển.mozilla.org / en

2
Thử nghiệm duy nhất không tạo ra a ReferenceError.
Nỗi nhớ.io

2
Mã này là chính xác, nhưng tôi nghĩ rằng nói undefinedlà một đối tượng trong javascript là thông tin sai. Câu nói này có liên quan đến câu trả lời của bạn không? Nó là một giá trị undefinedcủa loại undefined, được gán cho định danh toàn cầu có tên undefined.
SimplGy

1
Điều này bây giờ không chính xác về mặt nó là cách duy nhất. undefinedđã được đọc từ ES5. Bạn có thể kiểm tra một cách an toàn cho việc không xác định bằng cách sử dụng if (x === undefined) {...}hoặc sử dụng tốc ký như thế này : if (x === void 0).
Stephen M Irving

66

Về mặt kỹ thuật, giải pháp thích hợp là (tôi tin):

typeof x === "undefined"

Đôi khi bạn có thể lười biếng và sử dụng

x == null

nhưng điều đó cho phép cả biến x không xác định và biến x chứa null, trả về true.


1
nếu bạn gõ var x;và sau đó typeof x;bạn sẽ nhận được "undefined"giống như bạn đã làmtypeof lakjdflkdsjflsj;
Muhammad Umer

Vì vậy, không có cách nào để kiểm tra biến không xác định nhưng khai báo?
Muhammad Umer

1
Tôi không nghĩ vậy; Tôi không chắc tại sao bạn muốn.
Jason S

ujnd xác định không nên ở giữa những lời xin lỗi
LowFieldTheory

bạn có ý gì bởi những lời xin lỗi?
Jason S

19

Một phiên bản thậm chí dễ dàng hơn và tốc ký hơn sẽ là:

if (!x) {
   //Undefined
}

HOẶC LÀ

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
đoạn mã đầu tiên có thể không chính xác nếu x được đặt từ lệnh gọi hàm. như x = A (); nếu A không trả về bất cứ thứ gì, nó sẽ trả về "không xác định" theo mặc định. Làm a! X sẽ là đúng mà sẽ đúng. Tuy nhiên, nếu A () trả về 0 thì! X sẽ sai thành x = 0. Tuy nhiên, trong JS, 0 cũng đúng.
Rajat

mã thứ hai có thể được rút ngắn thành: if (! typeof (XX)) {...} khác {...}
Alejandro Silva

2
@AlejandroSilva Xin lỗi vì đã trả lời trễ. Điều đó sẽ không hoạt động vì typeof trả về một chuỗi, vì vậy nó sẽ trả về 'không xác định' cho một biến không xác định, do đó sẽ đánh giá là TRUE do đó dẫn đến dương tính sai của var được xác định.
Dmitri Farkov

5
Xin hãy thoát khỏi đoạn trích đầu tiên, nó thật tệ
Juan Mendes

1
Các ý kiến ​​khác đã chỉ ra rằng ví dụ đầu tiên là xấu, nhưng không rõ tại sao. Vì vậy, đối với bất kỳ lập trình viên mới nào :! X không kiểm tra xem x có được xác định hay không, nhưng liệu nó có đúng không. Các chuỗi, boolean true và các số dương đều là sự thật (và tôi có thể quên một số thứ), nhưng các giá trị có khả năng hợp lệ khác như 0, boolean false và một chuỗi rỗng không phải là sự thật. Ví dụ đầu tiên có thể hoạt động cho các trường hợp sử dụng cụ thể (ví dụ: kiểm tra chuỗi nếu bạn có thể xử lý trống giống như không xác định), nhưng vì nhiều trường hợp không xảy ra, nên không được coi là cách mặc định để kiểm tra.
cfc

16

Tôi thường làm:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
Cân nhắc thay đổi "==" thành "===". Nếu bạn gọi doS Something (null), bạn cũng sẽ nhận được cảnh báo. Trừ khi đó là những gì bạn muốn.
Jason S

Vâng. Bạn phải quyết định nếu bạn muốn tương đương hoặc chính xác bằng nhau. Hoặc là trường hợp có thể có một sử dụng.
Joe

1
chỉ cần kiểm tra như thế này-> if (typeof biếnName! == 'không xác định') {alert (biếnName);}
Muhammad Sadiq

điều này là vô ích vì dù sao bạn sẽ không thể chuyển một var không xác định cho một hàm
avalanche1

2
Chắc chắn bạn có thể. Hãy thử gọi một hàm không có đối số.
Joe

3

Bạn cũng có thể sử dụng toán tử điều kiện ternary:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


Nếu như var a = false;? Bạn nên kiểm tra xem nếu a===undefinedthay vào đó
Iter Ator

1
Câu hỏi: kiểm tra một biến không xác định ..... Đây là biến không xác định: var x; làm ở trên sẽ gây ra lỗi
Muhammad Umer

"Nếu a = false, thì nó sẽ hiển thị" tôi không biết 'a' "" - Đó là vấn đề, câu hỏi là kiểm tra xem nó có được xác định không, có đúng không. Nếu a được định nghĩa là sai, thì a không được xác định. Điều này trả về kết quả sai trong trường hợp đó. Xem nhận xét của tôi trên stackoverflow.com/a/858270/2055492 để biết thêm chi tiết về lý do phương pháp này không hiệu quả.
cfc

không chỉ sẽ !akiểm tra cho đúng undefined, nó cũng kiểm tra đúng đối 0nullfalse. Điều này là rất không chính xác và cần được loại bỏ.
Stephen M Irving

2

Tôi thường sử dụng cách đơn giản nhất:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

BIÊN TẬP:

Nếu không khởi tạo biến, ngoại lệ sẽ được ném "Uncaught ReferenceError: biến không được xác định ..."


2
Uncaught ReferenceError: variable is not defined
Muhammad Umer

@MuhammadUmer, sai rồi! variableđược định nghĩa bởi var variable;. Và đoạn mã này sẽ ghi đè variabletrong phạm vi địa phương. Nó có thể phá vỡ logic mà dự kiến ​​sẽ truy cập vào một đóng hoặc biến toàn cục. Tức là:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Е г г г г г г

2

Một "giải pháp" tiềm năng khác là sử dụng windowđối tượng. Nó tránh được vấn đề lỗi tham chiếu khi ở trong trình duyệt.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

Điều này hoàn toàn không giải quyết được câu hỏi ban đầu và hoàn toàn không liên quan. Poster không hỏi làm thế nào để kiểm tra nếu một cái gì đó là sự thật hay falsey, anh ấy hỏi làm thế nào để kiểm tra undefined. Điều này sẽ không làm điều đó.
Stephen M Irving

2

Lỗi là nói với bạn rằng xthậm chí không tồn tại! Nó chưa được khai báo , khác với việc được gán một giá trị.

var x; // declaration
x = 2; // assignment

Nếu bạn khai báo x, bạn sẽ không gặp lỗi. Bạn sẽ nhận được một cảnh báo cho biết undefinedxtồn tại / đã được khai báo nhưng chưa được gán một giá trị.

Để kiểm tra xem biến đã được khai báo chưa, bạn có thể sử dụng typeof, bất kỳ phương pháp kiểm tra nào khác nếu một biến tồn tại sẽ đưa ra cùng một lỗi mà bạn gặp phải ban đầu.

if(typeof x  !==  "undefined") {
    alert(x);
}

Đây là kiểm tra loại giá trị được lưu trữ trong x. Nó sẽ chỉ trở lại undefinedkhi xchưa được khai báo HOẶC nếu nó đã được khai báo và chưa được chỉ định.


không xác định đã được đọc chỉ kể từ ES5 (phát hành năm 2009) và bạn không còn cần typeoftoán tử nữa.
Stephen M Irving

2

Các voidlợi nhuận điều hành undefinedcho bất kỳ tranh luận / biểu được truyền cho nó. vì vậy bạn có thể kiểm tra lại kết quả (trên thực tế một số minifiers thay đổi mã của bạn từ undefinedđể void 0tiết kiệm một vài ký tự)

Ví dụ:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

Ding Ding! Đây là câu trả lời chính xác. Xấu hổ là tất cả các cách ở phía dưới. Mọi người đều nôn nao khi vẫn sử dụng typeofvà suy nghĩ undefinedcó thể được chỉ định lại, điều này đã không thể thực hiện được trong khoảng một thập kỷ.
Stephen M Irving

Điều này cũng an toàn trước ES5 vì trước đó ngay cả khi bạn đã chỉ định lại undefined, vì Chúa chỉ biết lý do gì, sử dụng void 0sẽ luôn quay trở lại undefinedbất kể.
Stephen M Irving

1

Chúng tôi có thể kiểm tra undefinednhư sau

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

Chỉ cần làm một cái gì đó như dưới đây:

function isNotDefined(value) {
  return typeof value === "undefined";
}

và gọi nó như:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

Câu trả lời được chấp nhận là chính xác. Chỉ muốn thêm một lựa chọn. Bạn cũng có thể sử dụng try ... catchkhối để xử lý tình huống này. Một ví dụ quái đản:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Hãy nhận biết catchkhối, một chút lộn xộn, vì nó tạo ra một phạm vi cấp khối. Và, tất nhiên, ví dụ cực kỳ đơn giản để trả lời câu hỏi được hỏi, nó không bao gồm các thực tiễn tốt nhất trong xử lý lỗi;).


0

Tôi sử dụng một hàm nhỏ để xác minh một biến đã được khai báo, điều này thực sự cắt giảm lượng lộn xộn trong các tệp javascript của tôi. Tôi thêm một kiểm tra cho giá trị để đảm bảo rằng biến không chỉ tồn tại mà còn được gán một giá trị. Điều kiện thứ hai kiểm tra xem biến đó có được khởi tạo hay không, bởi vì nếu biến đã được xác định nhưng không được khởi tạo (xem ví dụ bên dưới), nó vẫn sẽ báo lỗi nếu bạn cố tham chiếu giá trị của nó trong mã của mình.

Không được khởi tạo - var my_variable;Khởi tạo -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Sau đó, bạn có thể sử dụng một câu lệnh có điều kiện để kiểm tra xem biến đó đã được xác định VÀ khởi tạo như thế này chưa ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

hoặc để kiểm tra rằng nó chưa được xác định và sử dụng ngay lập tức ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
Tại sao không trả lại vị ngữ của bạn ngay lập tức? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
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.