为什么 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;
为什么 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;
它指的是索引或键,而不是值。 0
并且1
是该数组的有效索引。还有有效的键,包括"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
。
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;
}
}
我猜你之前使用 Python,在 JS 中使用 Array.prototype.includes
let x = [1, 2]
x.includes(1) // true
在运算符中检查数组的索引而不是值
0 in [1, 2] // true
2 in [1, 2] // false
就像for in
迭代对象属性的 js 循环一样,in
操作符检查指定的属性是否在指定的对象或其原型链中。它不检查元素是否在数组中。
假设 x 是一个数组,用于在 nodejs/modern-browsersx.includes(element)
中返回。true/false
至于loop
,使用,for(let element of x)
因为 x 是 js iterable
。