2011-08-18 33 views
9

Có sự khác biệt nào giữaCách tốt nhất để so sánh giá trị với 'không xác định' là gì?

var a; 
(a == undefined) 
(a === undefined) 
((typeof a) == "undefined") 
((typeof a) === "undefined") 

Chúng tôi nên sử dụng cái nào?

+0

http://stackoverflow.com/q/2703102/469210 dường như có liên quan đến vấn đề này. – borrible

+1

có thể trùng lặp của [Javascript: undefined! == undefined?] (Http://stackoverflow.com/questions/776950/javascript-undefined-undefined) –

Trả lời

11

Trớ trêu thay, undefined có thể được định nghĩa lại trong JavaScript, không phải là bất cứ ai đầu óc bình thường sẽ làm điều đó, ví dụ:

undefined = "LOL!"; 

tại thời điểm đó tất cả các kiểm tra bình đẳng tương lai chống lại undefined sẽ năng suất kết quả bất ngờ!

Đối với chênh lệch giữa ===== (các nhà khai thác bình đẳng), == sẽ cố gắng ép buộc các giá trị từ loại này sang loại khác, trong tiếng Anh có nghĩa là 0 == "0" sẽ đánh giá đúng sự thật mặc dù các loại khác nhau (Số vs Chuỗi) - nhà phát triển có xu hướng tránh loại bình đẳng lỏng lẻo này vì nó có thể dẫn đến khó khăn để gỡ lỗi trong mã của bạn.

Kết quả là nó an toàn nhất để sử dụng:

"undefined" === typeof a 

Khi kiểm tra cho undefinedness :)

+2

({tries undefined = true}) Ai trong họ ... tại sao ... AAHG! TẠI SAO S W MỘT NGƯỜI? Đó là một thất bại thực sự của EcmaScript. Tôi chưa bao giờ nghĩ đến việc đó. – cwallenpoole

+0

Theo ví dụ của tôi, 'cho teh lolz!' Việc lặp lại tiếp theo của EcmaScript (tên mã Harmony) sẽ bao gồm hỗ trợ cho các hằng số, mà chỉ có thể là một điều tốt cho sự tỉnh táo của chúng ta;) http://wiki.ecmascript.org/doku.php?id=harmony%3aconst – JonnyReeves

+0

nó là liên kết cho phần đầu tiên của câu trả lời của bạn: http://stackoverflow.com/questions/2703102/typeof-undefined-vs-null/2703131#2703131 – JohnJohnGa

0
var a; 
(a == undefined) //true 
(a === undefined) //true 
((typeof a) == "undefined") //true 
((typeof a) === "undefined") //true 

NHƯNG:

var a; 
(a == "undefined") //false 
(a === "undefined") //false 
((typeof a) == undefined) //false 
((typeof a) === undefined) //false 
+0

Tất nhiên - câu hỏi là về sự khác biệt không phải là kết quả - – JohnJohnGa

+0

@JohnJohn nếu tất cả đều mang lại cùng một điều không có 'khác biệt'. Nhưng tôi tin rằng đặt cược tốt nhất là lựa chọn thứ 2 của bạn. – Neal

-2

Nếu bạn khai báo var a, sau đó nó sẽ không được undefined nữa - nó sẽ được null để thay thế. Tôi thường sử dụng typeof a == undefined - và nó hoạt động tốt. Điều này đặc biệt hữu ích trong tình huống này:

function myfunc(myvar) 
{ 
    if(typeof myvar == "undefined") 
    { 
     //the function was called without an argument, simply as myfunc() 
    } 
} 
+0

['typeof'] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/typeof) trả về một chuỗi. – Shef

+0

Điều đó nếu câu lệnh sẽ là 'FALSE' -' typeof' trả về một giá trị chuỗi. – Neal

+0

Vâng, tôi đã sử dụng nó ngay hôm nay trong một hệ thống sản xuất - và nó hoạt động hoàn hảo. –

-1

Nếu là undefined, sau đó

a == undefined 

sẽ thực sự ném ra một lỗi. Sử dụng

(typeof a) === "undefined" 

Thay vào đó.

+0

tại sao điều đó lại có lỗi? – Neal

+1

Gah, bạn nói đúng, tôi đã bỏ lỡ "var a" ở đầu mã OP. –

1

Cá nhân tôi thích sử dụng

[undefined, null].indexOf(variable) > -1 

để kiểm tra cũng cho các giá trị null.

0

Bạn nên sử dụng nêu trên:

"undefined" === typeof a 

Nhưng nếu bạn có rất nhiều biến để kiểm tra, mã của bạn có thể nhận được xấu xí tại một số điểm, vì vậy bạn có thể xem xét để sử dụng phương pháp của Java:

try { vvv=xxx; zzz=yyyy; mmm=nnn; ooo=ppp; } 
catch(err){ alert(err.message); } 

Rõ ràng cảnh báo() không nên được sử dụng trong phiên bản sản xuất, nhưng trong phiên bản gỡ lỗi, nó rất hữu ích. Nó sẽ làm việc ngay cả trong các trình duyệt cũ như IE 6:

https://msdn.microsoft.com/library/4yahc5d8%28v=vs.94%29.aspx

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