为什么这不会进入else-if块?

时间:2016-02-22 21:53:47

标签: javascript arrays foreach

function checkValues(data, key) {
    data.forEach(function(d, i) {
    if (d == key) {
        console.log(i + "\n");
        return i;
    }
  });
  return -1;
}

var arr = [2, 3, 7, 1];
var x = 1;

if (x == 2) {
    console.log("if!");
}
else if (checkValues(arr, x) != -1) {
    console.log("else if!");
}
else {
    console.log("else!");
}

它进入了else块。我当然希望这不是一件明显的事情。

https://jsfiddle.net/0ppfj19c/

2 个答案:

答案 0 :(得分:4)

return回调中的.forEach()仅返回.forEach机制;它不会导致从checkValues()返回。

我想你想要.findIndex()

function checkValues(data, key) {
  return data.findIndex(function(d) {
    return (d == key);
  });
}

不幸的是,Internet Explorer不支持.findIndex()(至少就上次MDN更新而言),但MDN页面不支持there is a polyfill available

答案 1 :(得分:1)

您在forEach循环的回调中使用的返回实际上并没有中断对checkValues的整个调用,因为它位于forEach的执行上下文中。因此,您的代码始终返回-1

更好的方法是存储价值。

function checkValues(data, key) {
    var index = -1;
    data.forEach(function(d, i) {
        if (d == key) {
            index = i;
        }
    });
    return index ;
}

但是,重构可能会更进一步。 indexOf确实可以处理像这样的原始值的数组。你可以这样做:

function checkValues(data,key){
    return data.indexOf(key);
}

一个简单的检查是[2, 3, 7, 1].indexOf(1),产生3