Javascript 在JS中调用函数时,如何使用逻辑NOT(!)运算符?
我正在从下划线库中创建函数,但在尝试实现Javascript 在JS中调用函数时,如何使用逻辑NOT(!)运算符?,javascript,operators,underscore.js,logical-operators,Javascript,Operators,Underscore.js,Logical Operators,我正在从下划线库中创建函数,但在尝试实现.reject()函数时遇到了障碍。出于这个问题的目的,我将包括我为三个函数编写的代码:.each()、.filter()和.reject() 根据,如果逻辑NOT(!)运算符的单个操作数可以转换为true,则返回false;否则,返回true。 但是当我运行下面的代码.reject([1,2,3],isEven)时,我得到一个错误,说测试不是一个函数。为什么我不能使用运算符?不能对函数求反。这是一件毫无意义的事情(除非您真的希望值false而不键入它)。
.reject()
函数时遇到了障碍。出于这个问题的目的,我将包括我为三个函数编写的代码:.each()
、.filter()
和.reject()
根据,如果逻辑NOT(!)运算符的单个操作数可以转换为true,则返回false;否则,返回true。
但是当我运行下面的代码
.reject([1,2,3],isEven)
时,我得到一个错误,说测试不是一个函数。为什么我不能使用调用函数(例如,.[1,2,3],!isEven)
)时的code>运算符?不能对函数求反。这是一件毫无意义的事情(除非您真的希望值false
而不键入它)。相反,您希望对函数的返回值求反。我怀疑你想要的是这样的
_.reject = function(collection, test) {
return _.filter(collection, function(e) { return !test(e); });
}
为什么我不能使用调用函数时的code>运算符(例如,uuu.filter([1,2,3],!isEven))
请注意,实际上您并没有调用isEven
,您只是在引用它。正如你所说,代码>“如果其单个操作数可以转换为true,则返回false;否则,返回true。”
isEven
是对函数的引用,即对象。对象转换为true
,因此!测试
结果为
错误
:
_.filter([1,2,3], false))
现在,您正在将布尔值而不是函数传递给\uu.filter
,因此出现错误消息“test不是函数”
相反,您必须传递一个否定测试函数结果的函数:
_.filter([1,2,3], function() {
return !test.apply(this, arguments);
});
当您引用函数而不是调用它时,您引用的是函数的对象引用:
function foo() {
alert("Hi there");
}
var f = foo; // <== Getting the function's reference, not calling it
f(); // <== Now we call it
或者,如果您想采用函数式编程方法,您可以编写一个函数,当调用该函数时,该函数将返回一个否定返回值的新函数:
_.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));
};
听起来你可能想要!改为test()
。否定一个函数是没有意义的。对函数的返回值求反更有用。啊,我认为对函数求反是一个la!isEven
将否定返回值。我发布了一个答案,可能会提供一个解决方案。让我知道进展如何。
function not(f) {
return function() {
return !f.apply(this, arguments);
};
}
_.reject = function(collection, test) {
return _.filter(collection, not(test));
};