为什么javascript';s";在;当测试0是否存在于不';不包含0?

为什么javascript';s";在;当测试0是否存在于不';不包含0?,javascript,arrays,in-operator,Javascript,Arrays,In Operator,为什么Javascript中的“in”操作符在测试数组中是否存在“0”时返回true,即使数组似乎不包含“0” 例如,这将返回true,并且有意义: var x = [1,2]; 1 in x; // true var x = [1,2]; 3 in x; // false 这将返回false,并且有意义: var x = [1,2]; 1 in x; // true var x = [1,2]; 3 in x; // false 然而,这是真的,我不明白为什么: var x = [1,

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

例如,这将返回true,并且有意义:

var x = [1,2];
1 in x; // true
var x = [1,2];
3 in x; // false
这将返回false,并且有意义:

var x = [1,2];
1 in x; // true
var x = [1,2];
3 in x; // false
然而,这是真的,我不明白为什么:

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

它指的是索引或键,而不是值
0
1
是该数组的有效索引。还有有效的键,包括
“length”
“toString”
。尝试x中的
2
。这将是错误的(因为JavaScript数组是0索引的)


请参见

中的操作符不会执行您认为它会执行的操作。如果指定的操作数是对象的属性,则中的
运算符返回
true
。对于数组,如果操作数是有效的索引,它将返回
true
(如果将数组视为一个特例对象,其中属性仅命名为0、1、2,…,则这是有意义的)

例如,尝试以下方法:

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

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

Javascript的
In
运算符不检查数组中是否包含值。它检查对象是否具有属性或索引。因此
var x=[4,5];4英寸x//x为假1//正确


因为长度是x的一个属性,所以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;
    }
}
if(![].indexOf){
Array.prototype.indexOf=函数(what,i){
i=i | | 0;
var L=此长度;
而(i=L)i=L-1;
如果(i<0)i+=L;
而(i>-1){
如果(这个[i]==什么)返回i;
--一,;
}
返回-1;
}
}

就像js
for in
循环迭代对象属性一样,
in
操作符检查指定属性是否在指定对象或其原型链中。它不检查元素是否在数组中


假设x是一个数组,在nodejs/modern浏览器中使用
x.includes(element)
返回
true/false
。至于
循环
,使用
for(让x的元素)
,因为x是一个js
可伸缩的

,我想你以前使用过Python,在js中,使用Array.prototype.includes

let x = [1, 2]
x.includes(1) // true
在运算符中,检查数组的索引而不是值

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

感谢您为这个问题提供了一个解决方案,而不仅仅是解释它为什么不起作用。”(如果将数组视为一个特例对象,其中属性仅命名为0、1、2……,这是很有意义的。根据规范,它们就是这样的。JavaScript引擎会在可能的情况下对它们进行优化。:-)