2010-06-18 12 views
28

Dlaczego operator "in" w kodzie Javascript zwraca true podczas testowania, jeśli w tablicy istnieje "0", nawet jeśli tablica nie zawiera "0"?Dlaczego operator "in" javascript zwraca wartość true podczas testowania, jeśli 0 istnieje w tablicy, która nie zawiera 0?

Na przykład, to zwraca wartość true, a sens:

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

ta zwraca false, a sens:

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

Jednak ta zwraca wartość true, a ja nie rozumiem dlaczego:

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

Odpowiedz

58

Odnosi się do indeksu lub klucza, a nie do wartości. 0 i 1 są prawidłowymi indeksami dla tej tablicy. Istnieją również ważne klucze, w tym "length" i "toSource". Wypróbuj 2 in x. To będzie fałsz (ponieważ tablice JavaScript są indeksowane 0).

Zobacz MDN documentation.

15

Operator in nie robi tego, co myślisz, że robi. Operator in zwraca true, jeśli określony operand jest właściwością obiektu. Dla tablic, zwraca true jeśli argument jest ważny Indeks (co ma sens, jeśli myśli o tablicach jako obiekt specjalnym przypadku, gdy właściwości są po prostu o nazwie 0, 1, 2, ...)

dla Przykład, spróbuj tego:

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

będzie również powrócić true, bo „2” to ważny wskaźnik do tablicy. W ten sam sposób "0" jest indeksem w tablicy, więc zwraca także true.

7

Operator Javascript in nie sprawdza, czy wartość jest zawarta w tablicy. Sprawdza, czy obiekt ma właściwość lub indeks. Tak więc var x = [4,5]; 4 in x; //false 1 in x; //true.

Ponieważ długość jest własnością x, "length" in x; //true

3

Nowoczesne przeglądarki, z wyjątkiem IE obsługuje kilka metod, które można znaleźć wartość w tablicy.

indexOf i lastIndexOf zwracają pierwszy (lub ostatni) indeks dokładnego dopasowania ich argumentów w tablicy lub -1, jeśli nie znaleziono pasującego elementu.

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

Możesz dodać jedną lub obie metody do IE i starszych 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

Dziękuję zapewniając obejście problemu, a nie tylko wyjaśnienie, dlaczego to nie działa. – Bobort

Powiązane problemy