Kiểm tra nếu một cái gì đó không được xác định trong JavaScript


224

Tôi đang kiểm tra if(response[0].title !== undefined), nhưng tôi nhận được lỗi:

Uncaught TypeError: Không thể đọc thuộc tính 'title' của không xác định.


Xem câu trả lời ở đây trong stackoverflow. stackoverflow.com/questions/858181/ trộm
Luis Valencia

Câu trả lời:


345

response[0] không được xác định, kiểm tra nếu nó được xác định và sau đó kiểm tra tiêu đề tài sản của nó.

if(typeof response[0] !== 'undefined' && typeof response[0].title !== 'undefined'){
    //Do something
}

20
Mặc dù số lượng phiếu bầu, đây không phải là một cách tốt để thực hiện kiểm tra vì undefinedkhông phải là một từ khóa JavaScript (mặc dù mọi người dường như nghĩ rằng nó là). Nếu bạn muốn, bạn có thể tạo một biến được gọi undefinedvà kiểm tra này sẽ không chính xác. Cách duy nhất đúng là kiểm tra (typeof myVar !== 'undefined').
BadHorsie

4
@BadHorsie có ý nghĩa, tôi đã cập nhật câu trả lời với bình luận của bạn.
amosrivera

1
Điều gì xảy ra nếu một biến tồn tại và chứa chuỗi đọc 'không xác định'?
TomeeNS

@BadHorsie Đối số của bạn là không có thật. Tại sao tôi nên xác định lại undefined?
Robert Siemer

@amosrivera Không, bình luận của anh ấy / cô ấy không có ý nghĩa. Bạn làm xấu đi câu trả lời của bạn.
Robert Siemer

39

Chỉ cần kiểm tra nếu response[0]không xác định:

if(response[0] !== undefined) { ... }

Nếu bạn vẫn cần kiểm tra rõ ràng tiêu đề, hãy làm như vậy sau lần kiểm tra ban đầu:

if(response[0] !== undefined && response[0].title !== undefined){ ... }

35

Tôi đã gặp rắc rối với tất cả các ví dụ mã khác ở trên. Trong Chrome, đây là điều kiện phù hợp với tôi:

typeof possiblyUndefinedVariable !== "undefined"

Tôi sẽ phải kiểm tra điều đó trong các trình duyệt khác và xem mọi thứ diễn ra như thế nào.


2
Tương tự - tôi thấy undefinedphải là một chuỗi.
lại

đây phải là một cái gì đó mới với chrome (tôi đang thắng chrome 41 atm). câu trả lời được chấp nhận sử dụng để làm việc tốt : P
joe

13

Trên thực tế, bạn phải bao quanh nó bằng khối Thử / Bắt để mã của bạn không ngừng hoạt động. Như thế này:

try{
    if(typeof response[0].title !== 'undefined') {
        doSomething();
    }
  }catch(e){
    console.log('responde[0].title is undefined'); 
  }

Tôi đã xem xét IE 8 và cần phải thử.
RonanOD

1
đây là cách tốt nhất nếu bạn đang kiểm tra nếu một chức năng không được xác định
edepperson

ném một lỗi để kiểm tra không xác định không phải là một giải pháp tốt. @amosrivera là giải pháp tốt nhất.
dùng3658423

@ user3658423: Nó không gây ra lỗi. Nó chỉ ngăn tập lệnh dừng nếu phản hồi không được khai báo (vì điều đó sẽ gây ra lỗi).
André Luiz

Đôi khi lỗi có thể hữu ích. Với giải pháp được đề xuất của bạn, nếu doS Something () đưa ra một ngoại lệ, tất cả những gì bạn sẽ thấy trong bảng điều khiển của mình là "response [0] .title không xác định", thay vì một thông báo hữu ích về "ngoại lệ không bắt được @ dòng 123 của tệp xyz .js ". Cuối cùng, một nhà phát triển thứ hai có thể sẽ nhận xét câu lệnh console.log (), khiến cho nhà phát triển thứ 3 gặp khó khăn hơn và khắc phục một lỗi xảy ra sâu bên trong doS Something ().
Eric Seastrand


1

Đó sẽ là vì response[0]bản thân nó không được xác định.



0

Kiểm tra xem bạn có response[0]thực sự tồn tại không, lỗi dường như cho thấy không.


0

Trước tiên, bạn phải kiểm tra xem response[0]có xác định được không và chỉ khi không, hãy kiểm tra phần còn lại. Điều đó có nghĩa là trong trường hợp của bạn, response[0]không xác định.


0

Tôi biết tôi đã đến đây muộn 7 tháng, nhưng tôi thấy câu hỏi này và nó có vẻ thú vị. Tôi đã thử điều này trên bảng điều khiển trình duyệt của tôi.

try{x,true}catch(e){false}

Nếu biến x không được xác định, lỗi sẽ bị bắt và nó sẽ sai, nếu không, nó sẽ trả về true. Vì vậy, bạn có thể sử dụng hàm eval để đặt giá trị thành một biến

var isxdefined = eval('try{x,true}catch(e){false}')

1
Một cách tiếp cận thú vị nếu tôi có thể nói như vậy bản thân mình.
Brandito

0

Trong một số câu trả lời này có một sự hiểu lầm cơ bản về cách sử dụng typeof.

Sai

if (typeof myVar === undefined) {

Chính xác

if (typeof myVar === 'undefined') {

Lý do là typeoftrả về một chuỗi. Do đó, bạn nên kiểm tra xem nó trả về chuỗi "không xác định" chứ không phải undefined(không được đặt trong dấu ngoặc kép), bản thân nó là một trong những kiểu nguyên thủy của JavaScript . Các typeofnhà điều hành sẽ không bao giờ quay trở lại một giá trị kiểu undefined.


Phụ lục

Mã của bạn về mặt kỹ thuật có thể hoạt động nếu bạn sử dụng so sánh không chính xác, nhưng có lẽ không phải vì lý do bạn nghĩ. Không có undefinedbiến có sẵn trong JavaScript - đó không phải là một loại từ khóa ma thuật mà bạn có thể so sánh. Bạn thực sự có thể tạo một biến được gọi undefinedvà cung cấp cho nó bất kỳ giá trị nào bạn muốn.

let undefined = 42;

Và đây là một ví dụ về cách bạn có thể sử dụng điều này để chứng minh phương pháp đầu tiên không chính xác:

https://jsfiddle.net/p6zha5dm/

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.