53

配列に「0」が含まれていないように見えても、配列に「0」が存在するかどうかをテストすると、Javascriptの「in」演算子がtrueを返すのはなぜですか。

たとえば、これはtrueを返し、意味があります。

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

これはfalseを返し、意味があります。

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

ただし、これはtrueを返し、理由がわかりません。

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

6 に答える 6

87

値ではなく、インデックスまたはキーを参照します。 0および1は、その配列の有効なインデックスです。"length"およびを含む有効なキーもあります"toString"。試してみてください2 in x。これは誤りです(JavaScript配列は0インデックスであるため)。

MDNドキュメントを参照してください。

于 2010-06-18T03:43:04.970 に答える
21

オペレーターは、inあなたが思っていることをしません。指定されたオペランドがオブジェクトのプロパティである場合、in演算子は戻ります。配列の場合、オペランドが有効なインデックスtrueであるかどうかを返します(配列を、プロパティの名前が0、1、2、...である特殊なケースのオブジェクトと考えると意味があります)。true

たとえば、次のことを試してください。

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

true「2」は配列への有効なインデックスであるため、も返されます。同様に、「0」は配列へのインデックスであるため、も返しますtrue

于 2010-06-18T03:44:16.307 に答える
9

Javascriptのin演算子は、値が配列に含まれているかどうかをチェックしません。オブジェクトにプロパティまたはインデックスがあるかどうかをチェックします。だからvar x = [4,5]; 4 in x; //false 1 in x; //true

長さはxのプロパティであるため、"length" in x; //true

于 2010-06-18T03:45:12.763 に答える
8

IEを除く最新のブラウザは、配列内の値を見つけることができるいくつかのメソッドをサポートしています。

indexOfおよびlastIndexOfは、配列内の引数と完全に一致する最初(または最後)のインデックスを返します。一致する要素が見つからなかった場合は-1を返します。

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

IEおよび古いブラウザに一方または両方のメソッドを追加できます-

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;
    }
}
于 2010-06-18T05:37:30.013 に答える
6

JSではArray.prototype.includesを使用する前にPythonを使用していると思います

let x = [1, 2]
x.includes(1) // true

演算子で、値ではなく配列のインデックスを確認してください

0 in [1, 2] // true
2 in [1, 2] // false
于 2019-11-20T06:11:28.213 に答える
2

for inオブジェクトのプロパティを繰り返すjsループと同様に、inオペレーターは、指定されたプロパティが指定されたオブジェクトまたはそのプロトタイプチェーンにあるかどうかを確認します。要素が配列内にあるかどうかはチェックしません。

xが配列であるとしましょう。これを使用して、nodejs/modern-browsersx.includes(element)に戻ります。true/falseは、xがjsなのでloop使用します。for(let element of x)iterable

于 2018-12-08T15:49:45.687 に答える