Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JS中调用函数时,如何使用逻辑NOT(!)运算符?_Javascript_Operators_Underscore.js_Logical Operators - Fatal编程技术网

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); });
}
为什么我不能使用
运算符(例如,
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));
};