2012-07-08 21 views
20

Tôi muốn boolean để đi ra biểu hiện nàyLàm cách nào để tôi có thể so sánh một đối tượng JavaScript không tồn tại để không xác định mà không gặp lỗi tham chiếu?

(task === undefined); 

nơi task là tùy ý và không xuất hiện trong các mã ở tất cả.

Tuy nhiên, khi tôi chạy điều này trong tê giác, tôi nhận được một lỗi tham chiếu. TÔI MUỐN TRUE

Tại sao tôi không thành sự thật?

Tôi muốn kiểm tra xem một biến cụ thể đã được xác định chưa. Làm thế nào để làm điều đó sau đó nếu điều này không hoạt động?

Trả lời

48

Sử dụng này:

(typeof task === "undefined") 

Khi bạn sử dụng (task === undefined), Javascript cần tìm giá trị của task để xem nếu nó cũng giống như undefined, nhưng nó không thể nhìn lên tên vì nó doesn' t tồn tại, cho bạn lỗi tham chiếu. typeof đặc biệt ở chỗ nó có thể trả về kiểu tên không tồn tại một cách an toàn.

+0

Cảm ơn bạn! Tại sao JavaScript không chỉ khai báo tác vụ không xác định, vì nó là nghĩa đen không xác định? – Fawkes5

+0

Như tôi đã đề cập, bạn không thể sử dụng tên 'tác vụ' nếu nó không được xác định, nó sẽ tăng một ngoại lệ như bạn đã thấy. 'typeof' là đặc biệt. Và Javascript đã tuyên bố nó không xác định, nó đã làm nó bằng cách nâng cao lỗi! –

+0

@ Fawkes5: có sự khác biệt giữa "biến tồn tại nhưng có giá trị' undefined' "và" biến không tồn tại chút nào ". – nnnnnn

6

Phụ lục cho câu trả lời được chấp nhận để hiểu tại sao nó không hoạt động với một số ví dụ bạn có thể tự thử trong bảng điều khiển javascript.

So sánh trực tiếp với loại không xác định chỉ hoạt động nếu biến tồn tại. Dưới đây là kết quả bạn sẽ nhận được từ trình duyệt Google Chrome:

> task === undefined 
    ReferenceError: task is not defined 

Tuy nhiên nếu biến tồn tại nó sẽ làm việc:

// continued from above 
> var task 
    undefined 
> task === undefined 
    true 

Đây là lý do tại sao bạn nên sử dụng giải pháp thay typeof bởi vì nó sẽ làm việc trong tất cả trường hợp không có lỗi (và phá vỡ việc thực thi mã javascript).

// continued from above 
> typeof notavariable === 'undefined' 
    true 
> typeof task === 'undefined' 
    true 

Lưu ý rằng bạn không cần phải kiểm tra typeof trong một số trường hợp, chẳng hạn như các thuộc tính trong một đối tượng theo nghĩa đen:

// continued from above 
> var obj = {} 
    undefined 
> obj.test === undefined 
    true 
> obj.test = 1 
    1 
> obj.test === undefined 
    false 

Điều này là do các thuộc tính trong một đối tượng cư xử giống như các giá trị trong một mảng kết hợp:

// continued from above 
> obj["test"] 
    1 
> obj["test"] === undefined 
    false 

Tuy nhiên bạn có thể không phải luôn luôn chắc chắn đây là một trường hợp trong một chức năng mà bạn không có quyền kiểm soát đầu vào đối số:

// continued from above 
> function TestFunc(arg1) { console.log(arg1) } 
    undefined 
> TestFunc(notavariable) 
    ReferenceError: notavariable is not defined 
> TestFunc(task) 
    undefined 
    undefined 
> TestFunc(obj["lol"]) 
    undefined 
    undefined 

Hy vọng bài tập này sẽ giúp bạn hiểu được lý do tại sao so sánh này.

Các vấn đề liên quan