2013-05-23 43 views
46

Tôi biết có hai phương pháp để xác định xem một biến tồn tại và không phải null (false, trống) trong javascript:Kiểm tra nếu một biến tồn tại trong javascript

1) if (typeof variableName !== 'undefined' && variableName)

2) if (window.variableName)

cái nào được ưa thích hơn và tại sao?

+2

Tại sao 'window.variableName'? Nếu biến là cục bộ, biến đó sẽ không được xác định ngay cả khi biến được xác định. –

+0

Ngoài ra, là "không null" là trực giao cho dù giá trị của biến là 'false'. –

+1

Coffeescript có toán tử riêng cho vấn đề này và mã JS được tạo ra từ nó khá thú vị. http://stackoverflow.com/questions/9992620/coffeescript-existential-operator-and-this –

Trả lời

67

Biến là được khai báo nếu truy cập tên biến sẽ không tạo tham chiếu lỗi. Nếu biểu thức typeof variableName !== 'undefined' sẽ false chỉ theo một trong hai trường hợp:

  • biến không được khai báo (ví dụ, không có var variableName trong phạm vi), hoặc
  • biến được khai báo và giá trị của nó là undefined (tức là, giá trị của biến được không được định nghĩa)

Nếu không, việc so sánh để đánh giá true.

Nếu bạn thực sự muốn kiểm tra nếu một biến được khai báo hay không, bạn sẽ cần phải catch bất kỳ ReferenceError sản xuất bằng cách giới thiệu với nó:

var barIsDeclared = true; 
try{ bar; } 
catch(e) { 
    if(e.name == "ReferenceError") { 
     barIsDeclared = false; 
    } 
} 

Nếu bạn chỉ đơn thuần muốn kiểm tra nếu giá trị một biến khai báo của không phải là undefined cũng không null, bạn chỉ có thể kiểm tra cho nó:

if(variableName !== undefined && variableName !== null) { ... } 

Hoặc tương đương, với một tấm séc bình đẳng không nghiêm ngặt chống lại null:

if(variableName != null) { ... } 

Cả hai ví dụ thứ hai của mình và biểu hiện bên tay phải của bạn trong các bài kiểm tra hoạt động && nếu giá trị là "falsey", nghĩa là, nếu nó cưỡng ép để false trong một bối cảnh boolean. Các giá trị như vậy bao gồm null, false, 0 và chuỗi rỗng, không phải tất cả các chuỗi mà bạn có thể muốn hủy.

+0

Sự khác nhau giữa "biến không được khai báo" và "biến không được khai báo" là gì? –

+0

@TomasZubiri Không có sự khác biệt; Tôi vừa mới thay đổi "kiểm tra nếu một biến không được khai báo" để "kiểm tra xem một biến có được khai báo hay không". Tôi hy vọng điều đó rõ ràng hơn. – apsillers

+0

Ồ tôi nhận được nó, bởi vì các thử nghiệm khác sẽ trả về false nếu biến đã được khai báo nhưng giá trị là không xác định. –

16

Điều quan trọng cần lưu ý là 'không xác định' là giá trị hoàn toàn hợp lệ cho một biến được giữ. Nếu bạn muốn kiểm tra xem biến tồn tại ở tất cả,

if (window.variableName) 

là một tấm séc hoàn thiện hơn, vì nó được xác minh rằng các biến đã thực sự được xác định. Tuy nhiên, điều này chỉ hữu ích nếu biến được đảm bảo là một đối tượng! Ngoài ra, như những người khác đã chỉ ra, điều này cũng có thể trả về false nếu giá trị của variableName là false, 0, '' hoặc null.

Điều đó nói rằng, điều đó thường không đủ cho mục đích hàng ngày của chúng tôi, vì chúng tôi thường không muốn có giá trị không xác định. Như vậy, trước tiên bạn nên kiểm tra xem biến đã được định nghĩa chưa, và sau đó xác nhận rằng biến này không được định nghĩa bằng toán tử typeof, như Adam đã chỉ ra, sẽ không trả về undefined trừ khi biến thực sự là undefined.

if (variableName && typeof variableName !== 'undefined') 
+0

Trong khi không xác định có thể bằng một giá trị hợp lệ cho một biến để giữ, kiểm tra typeof sẽ không trả về undefined trừ khi biến thực sự là undefined. – Adam

+3

'if (cửa sổ.variableName) 'có một lỗ hổng lớn, trong đó nó sẽ trả về một giá trị âm sai cho bất cứ điều gì mà ** đã được xác định, nhưng là giả. Vì vậy, bất kỳ biến nào là 'false',' 0', '''', 'null', hoặc các biến khác sẽ cho kết quả sai. –

+0

Cảm ơn các điểm tuyệt vời. Nó tiếp tục giúp củng cố sự hiểu biết của riêng tôi và tôi đã cập nhật câu trả lời của tôi để phản ánh ý kiến ​​của bạn. –

0

if (variable) có thể được sử dụng nếu biến là đảm bảo được một đối tượng, hoặc nếu sai, 0, vv được coi là "mặc định" giá trị (do đó tương đương với undefined hoặc null).

typeof variable == 'undefined' có thể được sử dụng trong trường hợp một null được chỉ định có ý nghĩa riêng biệt với biến hoặc thuộc tính chưa được khởi tạo. Kiểm tra này sẽ không ném và lỗi là biến không được khai báo.

1
if (typeof variableName !== 'undefined' && variableName) 
//// could throw an error if var doesnt exist at all 

if (window.variableName) 
//// could be true if var == 0 

////further on it depends on what is stored into that var 
// if you expect an object to be stored in that var maybe 
if (!!window.variableName) 
//could be the right way 

best way => see what works for your case 
5

Nếu bạn muốn kiểm tra xem một biến (nói v) đã được xác định và không phải là null:

if (typeof v !== 'undefined' && v !== null) { 
    // Do some operation 
} 

Nếu bạn muốn kiểm tra cho tất cả các giá trị falsy như: undefined, null, '', 0, false:

if (v) { 
    // Do some operation 
} 
3

tôi đang viết một câu trả lời duy nhất bởi vì tôi không có đủ uy tín để comm đưa câu trả lời được chấp nhận từ apsillers. Tôi đồng ý với câu trả lời của mình, nhưng

If you really want to test if a variable is undeclared, you'll need to catch the ReferenceError ...

không phải là cách duy nhất. Người ta có thể làm chỉ là:

this.hasOwnProperty("bar") 

để kiểm tra nếu có một biến thanh khai báo trong bối cảnh hiện nay. (Tôi không chắc chắn, nhưng gọi số hasOwnProperty cũng có thể nhanh hơn/hiệu quả hơn việc tăng ngoại lệ) Điều này chỉ hoạt động cho ngữ cảnh hiện tại (không áp dụng cho toàn bộ phạm vi hiện tại).

0

Tôi thấy điều này ngắn hơn và tốt hơn nhiều: lần

if(varName !== (undefined || null)) { //do something } 
-1

khác bạn phải đối phó với nó như là một ngoại lệ ReferenceError.

try { 
      //user variable 
      console.log(varName); 
    }catch(error){ 
     //variable is not defined 
     console.log(error); 
    } 
Các vấn đề liên quan