使用“in”关键字检查 0 始终返回 true

Using 'in' keyword to check for 0 always returns true?

本文关键字:返回 true 检查 in 关键字 使用      更新时间:2023-09-26

采用以下代码段:

var testArr = [1, 2, 3, 4, 5];
function check(num) {
    if (num !== undefined) {
        if (num in testArr) {
            alert("in");
        } else {
            alert("not in");
        }
    }
}

使用 check() 函数,我尝试检查给定参数是否是 testArr 数组的一部分。

通常,该函数工作正常,仅在检查0满足条件时,尽管0不是数组的一部分。亲眼看看:小提琴

为什么会这样?

我能想到的一个可能的解决方案是,在某些情况下(== vs === 0被评估为false,但是当false作为参数传递时,不满足条件,这对我来说没有任何意义——我很困惑。

在本例中,您返回了数组中存在索引,但不包含值。请参阅运算符中的此文档。我认为您必须使用 indexOf 函数验证数组的值。

您想使用该[].indexOf(elem) (doc) 并检查-1是否不在数组中。 这个问题中还提到了其他一些方法如何检查数组是否包含 JavaScript 中的对象?

您的代码将更新如下:

var testArr = [1, 2, 3, 4, 5];
function check(num) {
    if (num !== undefined) {
        if (testArr.indexOf(num) != -1) {
            alert("in");
        } else {
            alert("not in");
        }
    }
}

in运算符搜索键,0将是任何非空数组中的有效索引。 in不会对所有数组返回 true。 尝试使用空数组[]

"

in"正在按键检查。你有testArr[0],所以你可以得到alert("in")。

也就是说,如果你使用 check(0)~check(4) 将是 alert("in"),其他将被提醒("不在"),例如 check(5)。

var testArr = [1, 2, 3, 4, 5];
function check(num) {
  if (num in testArr) {
    return "check(" + i + ") = in ";
  } else {
    return "check(" + i + ") = not in ";
  }
}
for (var i = 0; i <= 6; i++) {
  document.write(check(i) + "<br>")
}

来自 in 运算符的 prop 参数将搜索属性或检查索引是否存在。

从文档中:

prop:表示属性名称或属性名称的字符串或数值表达式 数组索引。

从其中一个例子来看:

必须指定索引号,而不是该索引处的值。

如果您这样做:

<script>
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
'length' in trees // returns true because length is a property.
</script>

因此,在您的情况下,您正在询问check函数是否存在索引 0。