Pertanyaan Mengapa operator "dalam" javascript kembali benar ketika menguji apakah 0 ada dalam larik yang tidak berisi 0?


Mengapa operator "dalam" di Javascript kembali benar ketika menguji apakah "0" ada dalam larik, bahkan ketika larik tampaknya tidak berisi "0"?

Misalnya, ini mengembalikan nilai true, dan masuk akal:

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

Ini mengembalikan salah, dan masuk akal:

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

Namun ini mengembalikan nilai true, dan saya tidak mengerti mengapa:

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

35
2018-06-18 03:40


asal


Jawaban:


Ini mengacu pada indeks atau kunci, bukan nilainya. 0 dan 1 adalah indeks yang valid untuk larik itu. Ada juga kunci yang valid, termasuk "length" dan "toSource". Mencoba 2 in x. Itu akan salah (karena array JavaScript diindeks 0).

Lihat Dokumentasi MDN.


64
2018-06-18 03:43



Itu in Operator tidak melakukan apa yang Anda pikirkan. Itu in operator kembali true jika operan yang ditentukan adalah milik objek. Untuk array, ia kembali true jika operand itu valid indeks (yang masuk akal jika menganggap array sebagai objek kasus khusus di mana properti hanya bernama 0, 1, 2, ...)

Misalnya, coba ini:

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

Itu juga akan kembali true, karena "2" adalah indeks yang valid ke dalam larik. Dengan cara yang sama, "0" adalah indeks ke dalam array, sehingga juga mengembalikan true.


15
2018-06-18 03:44



Javascript in operator tidak memeriksa apakah suatu nilai terkandung dalam array. Ini memeriksa apakah objek memiliki properti atau indeks. Begitu var x = [4,5]; 4 in x; //false 1 in x; //true.

Karena panjang adalah milik x, "length" in x; //true


8
2018-06-18 03:45



Browser modern, kecuali IE, mendukung beberapa metode yang dapat menemukan nilai  dalam sebuah array.

indexOf dan lastIndexOf mengembalikan indeks pertama (atau terakhir) dari pencocokan tepat argumen mereka dalam larik, atau -1, jika tidak ditemukan elemen yang cocok.

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

Anda dapat menambahkan satu atau kedua metode ke IE dan browser lama-

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;
    }
}

6
2018-06-18 05:37