我正在从下划线库中重新创建函数,但在尝试实现 _.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
引用,所以它是真实的;所以 !isEven
是 false
。不是你想要的。 :-)
您的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/