为什么在测试不包含 0 的数组中是否存在 0 时,javascript 的“in”运算符返回 true?

IT技术 javascript arrays in-operator
2021-01-29 04:18:38

为什么 Javascript 中的“in”运算符在测试数组中是否存在“0”时返回 true,即使数组似乎不包含“0”?

例如,这返回 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;
6个回答

它指的是索引或键,而不是值。 01是该数组的有效索引。还有有效的键,包括"length""toString"试试2 in x那将是错误的(因为 JavaScript 数组是 0 索引的)。

请参阅MDN 文档

in运营商不这样做,你在想它做什么。in运营商的回报true,如果指定的操作数是对象的属性。对于数组,true如果操作数是有效索引,则返回(如果将数组视为特殊情况对象,其中属性仅命名为 0, 1, 2, ...,则这是有意义的)

例如,试试这个:

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

它也会返回true,因为“2”是数组的有效索引。同样,“0”是数组的索引,因此也返回true.

“(如果将数组视为一个特例对象,其中的属性被简单地命名为 0、1、2 ……这是有道理的。”根据规范,这就是它们的含义。当然,JavaScript 引擎会在可能的情况下优化它们。 :-)
2021-03-16 04:18:38

Javascript 的in运算符不检查值是否包含在数组中。它检查对象是否具有属性或索引。所以var x = [4,5]; 4 in x; //false 1 in x; //true

因为长度是 x 的一个属性, "length" in x; //true

现代浏览器(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;
    }
}
感谢您提供解决问题的方法,而不仅仅是解释为什么它不起作用。
2021-03-20 04:18:38

我猜你之前用过 Python,在 JS 中,使用 Array.prototype.includes

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

运算符中检查数组的索引而不是值

0 in [1, 2] // true
2 in [1, 2] // false