2010-06-18 15 views
28

Tại sao toán tử "trong" trong Javascript trả về true khi kiểm tra nếu "0" tồn tại trong mảng, ngay cả khi mảng không xuất hiện chứa "0"?Tại sao toán tử "in" của javascript trả về true khi kiểm tra nếu 0 tồn tại trong một mảng không chứa 0?

Ví dụ, điều này trả về true, và làm cho tinh thần:

var x = [1,2]; 
1 in x; // true 

này trả về false, và làm cho tinh thần:

var x = [1,2]; 
3 in x; // false 

Tuy nhiên này trả về true, và tôi không hiểu tại sao:

var x = [1,2]; 
0 in x; 

Trả lời

58

Nó đề cập đến chỉ mục hoặc khóa, không phải giá trị. 01 là các chỉ số hợp lệ cho mảng đó. Ngoài ra còn có các khóa hợp lệ, bao gồm "length""toSource". Hãy thử 2 in x. Điều đó sẽ là sai (vì các mảng JavaScript được lập chỉ mục 0).

Xem MDN documentation.

15

Nhà điều hành in không làm những gì bạn đang nghĩ. Toán tử in trả về true nếu toán hạng được chỉ định là thuộc tính của đối tượng. Đối với mảng, nó trả về true nếu toán hạng là một chỉ số hợp lệ (có ý nghĩa nếu nghĩ về mảng là đối tượng đặc biệt trong đó các thuộc tính chỉ được đặt tên 0, 1, 2, ...)

ví dụ: hãy thử điều này:

javascript:var x=[1,4,6]; alert(2 in x); 

Nó cũng sẽ trả lại true, vì "2" là một chỉ mục hợp lệ vào mảng. Trong cùng một cách, "0" là một chỉ mục trong mảng, vì vậy cũng trả về true.

7

Toán tử in của Javascript không kiểm tra xem giá trị có được chứa trong một mảng hay không. Nó kiểm tra nếu đối tượng có một thuộc tính hoặc chỉ mục. Vì vậy, var x = [4,5]; 4 in x; //false 1 in x; //true.

Bởi vì chiều dài là một tài sản của x, "length" in x; //true

3

Trình duyệt hiện tại, ngoại trừ IE, hỗ trợ một vài phương pháp có thể tìm thấy một giá trị trong một mảng.

indexOf và lastIndexOf trả về chỉ mục đầu tiên (hoặc cuối cùng) của đối sánh chính xác đối số của chúng trong một mảng hoặc -1, nếu không tìm thấy phần tử phù hợp.

if(A.indexOf(0)!= -1){ 
    // the array contains an element with the value 0. 
} 

Bạn có thể thêm một hoặc cả hai phương pháp để IE trở lên browsers-

if(![].indexOf){ 
    Array.prototype.indexOf= function(what, i){ 
     i= i || 0; 
     var L= this.length; 
     while(i< L){ 
      if(this[i]=== what) return i; 
      ++i; 
     } 
     return -1; 
    } 
    Array.prototype.lastIndexOf= function(what, i){ 
     var L= this.length; 
     i= i || L-1; 
     if(isNaN(i) || i>= L) i= L-1; 
     else if(i< 0) i += L; 
     while(i> -1){ 
      if(this[i]=== what) return i; 
      --i; 
     } 
     return -1; 
    } 
} 
+0

Cảm ơn bạn cung cấp một workaround cho vấn đề chứ không phải chỉ là một lời giải thích là tại sao nó không hoạt động. – Bobort