Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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中创建一个方法_Javascript - Fatal编程技术网

有条件地应用一个!在JavaScript中创建一个方法

有条件地应用一个!在JavaScript中创建一个方法,javascript,Javascript,我不知道如何更好地表达这一点(因此,无法找到以前的答案,尽管我希望这已经得到了回答),但我感兴趣的是,是否有一种方法可以将代码转换为这样: if ( this.props.mailboxFilter == 'sent' ) { return this.currentUser.canActOnBehalfOf( m.senderID ); } else { return !this.currentUser.canActOnBehalfOf( m.senderID ); } 类似以下内容(

我不知道如何更好地表达这一点(因此,无法找到以前的答案,尽管我希望这已经得到了回答),但我感兴趣的是,是否有一种方法可以将代码转换为这样:

if ( this.props.mailboxFilter == 'sent' ) {
  return this.currentUser.canActOnBehalfOf( m.senderID );
} else {
  return !this.currentUser.canActOnBehalfOf( m.senderID );
}
类似以下内容(不确定如何更好地表达):


与中一样,有没有一种方法可以通过选择是否使用bang调用
return
行来避免扩展的if/else语法和所有重复?

假设您使用的是javascript,那么可以使用
eval
方法来计算javascript代码字符串。您可以有条件地将bang应用于字符串的前面,然后返回
eval

的结果。您可以通过其他方式简化它:

var response = this.currentUser.canActOnBehalfOf(m.senderID);
return this.props.mailboxFilter == 'sent' ? response : !response;

通常,如果函数更改了任何状态,您都希望避免使用此方法。但是,由于在本例中,您将不考虑调用它,因此首先缓存它的值是没有害处的。

如果
this.currentUser.canActOnBehalfOf(m.senderID)
始终返回布尔值,则可以执行XOR

return (this.props.mailboxFilter != 'sent') ^ this.currentUser.canActOnBehalfOf(m.senderID);
异或一个布尔值加上
true
将生成一个NOT。带有
false
的异或生成一个保持相同值的缓冲区

请注意,我将
==
更改为
=

而且,如果您要实际使用它,请确保在代码的这一部分上添加注释。过一段时间后阅读此代码并不是那么容易

更新

正如所建议的,最好使用布尔异或
=
返回布尔值

return (this.props.mailboxFilter != 'sent') != this.currentUser.canActOnBehalfOf(m.senderID);

当然,如果它也可以与布尔XNOR一起使用,只需将两者替换为
===
的code>s

此处要使用布尔XNOR运算符-也称为等价:


关于为什么或者为什么不做这样的事情,有很多好的评论。我假设OP有充分的理由希望在函数调用的结果前面应用bang(!)。我的回答更像是对OP问题的技术解决方案

function bang(r) {
    return !r;
}
function notBang(r) {
    return r;
}
function canActOnBehalf() {
    return true;
}
var filter = 'notsent';
var f = (filter == 'sent' ? bang : notBang);
f(canActOnBehalf('whatever'));

解决方案可能在您的逻辑中的其他地方。是否确实要发送权限的倒数?这看起来很奇怪,为什么不呢?这并不是要挑战你,我真的很好奇。这两个评论都不是建设性的。这里:有很多关于它的文章来自比我更有知识的人。几乎在任何情况下,这都是一种被当作坏习惯钻进去的东西@isherwood的链接很好。好的,我知道存在注射风险,但在这种情况下,他不允许用户输入
eval
中使用的任何代码。我看不出有什么风险。这是最有效的方法。我喜欢这个。。。但你未来的自己不会@当然,Xophmeister:)一个人可以用它来最大限度地保证他的工作安全!没有其他人可以读取此代码!这将返回一个数字,而不是布尔值。@JamesWakefield:如果是用XOR完成的,则只需使用布尔值XOR:
=:-)
return this.currentUser.canActOnBehalfOf(m.senderID) == (this.props.mailboxFilter == 'sent');
function bang(r) {
    return !r;
}
function notBang(r) {
    return r;
}
function canActOnBehalf() {
    return true;
}
var filter = 'notsent';
var f = (filter == 'sent' ? bang : notBang);
f(canActOnBehalf('whatever'));