javascript - JS调用函数时如何使用逻辑非(!)运算符?

标签 javascript operators underscore.js logical-operators

我正在从下划线库中重新创建函数,但在尝试实现 _.reject() 函数时遇到了障碍。出于这个问题的目的,我将包含我为三个函数编写的代码:_.each()_.filter()_.reject().

_.each = function(collection, iterator) {
  if (Array.isArray(collection)) {
    for (var i = 0; i < collection.length; i++) {
      iterator(collection[i], i, collection);
    }
  } else {
    for (var i in collection) {
      iterator(collection[i], i, collection);
    }
  }
};

_.filter = function(collection, test) {
    var results = [];

    _.each(collection, function(i) {
      if (test(i)) {
        results.push(i);
      }
    })

    return results;
};

这是我遇到问题的函数的代码,_.reject() 方法,以及我遇到的 isEven() 函数'作为 test 参数传入。

_.reject = function(collection, test) {
    return _.filter(collection, !test);
}; 

var isEven = function(x) {
    if (x % 2 === 0) return true;
    return false;
};

根据 MDN's page on Expressions and Operators , 逻辑非 (!) 运算符 如果其单个操作数可以转换为真,则返回假;否则,返回 true。

但是当我运行下面的代码时 _.reject([1,2,3], isEven) 我得到一个错误提示 test is not a function。为什么我在调用函数时无法使用 ! 运算符(例如,_.filter([1,2,3], !isEven))?

最佳答案

当您引用函数而不是调用它时,您指的是函数的对象引用:

function foo() {
    alert("Hi there");
}

var f = foo; // <== Getting the function's reference, not calling it
f();         // <== Now we call it

所以 !isEven 将否定函数引用。因为 isEven 是一个非 null 引用,所以它是真实的;所以 !isEvenfalse。不是你想要的。 :-)

您的reject 可以用调用test 并反转其返回值的函数编写:

_.reject = function(collection, test) {
  return _.filter(collection, function(e) { return !test(e); });
};

或者,如果您想使用函数式编程方法,您可以编写一个函数,当调用该函数时,将返回一个函数,该函数否定返回值:

function not(f) {
    return function() {
        return !f.apply(this, arguments);
    };
}

然后在任何你想反转回调的含义的地方,你只需使用invert:

_.reject = function(collection, test) {
  return _.filter(collection, not(test));
};

关于javascript - JS调用函数时如何使用逻辑非(!)运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721205/

相关文章:

javascript - 如何将 JSON URL 传递给 jQuery 函数?

c# - 一个语句怎么可能同时有 = 和 ==?

java - Java 中的 BigDecimal 类 - 常量值背后的原因

javascript - Jquery Promise 主干提取

javascript - 指定选择器时,为什么 jQuery .index() 方法仅适用于集合中的第一个元素?

javascript - 如果没有可显示的内容,请禁用选择

javascript - 使用引导文本轮播淡入和淡出背景

c - 如何在 C 中使用大于和小于(> 和 <)比较 float

javascript - 在 JavaScript 中将方法用作(curried)函数

使用 _.extend 进行继承的 Javascript 设计方法