使用''检查0的关键字总是返回true?

时间:2015-03-13 21:15:46

标签: javascript

采取以下代码:

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不是数组的一部分。亲眼看看:Fiddle

为什么会这样?

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

4 个答案:

答案 0 :(得分:2)

在这种情况下,您返回索引存在于数组中但不存在值。请参阅此文档in operator。我认为你必须使用indexOf函数验证数组的值。

答案 1 :(得分:1)

您想使用[].indexOf(elem)doc)并检查-1是否不在数组中。此问题中还提到了一些其他方法How do I check if an array includes an object in 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。尝试使用空数组[]

答案 2 :(得分:1)

“in”正在按键检查。 你有testArr [0]所以你可以得到警报(“in”)。

也就是说,如果你使用check(0)~check(4)将会发出警报(“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>")
}

答案 3 :(得分:0)

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

来自文档:

  

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

从其中一个例子中可以看出:

  

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

如果你这样做:

<script>

var trees = new Array("redwood", "bay", "cedar", "oak", "maple");

'length' in trees // returns true because length is a property.

</script>

因此,在您的情况下,如果索引0存在,则询问check函数。