我看到一些代码似乎使用了一个我无法识别的运算符,以两个感叹号的形式出现,如下所示:!!.有人可以告诉我这个运营商的作用吗?
我看到这个的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
Run Code Online (Sandbox Code Playgroud) 在最近的求职面试过程中,我提交了一些使用所谓的"秘密" !! 操作符的 Perl代码示例.后来,在讨论代码时,其中一位采访者问我为什么选择使用它,并表示它被认为是不好的形式.他没有详细说明原因.
我的团队和我一直使用这个运营商多年,没有意识到它被认为是"糟糕的形式".
"砰砰"操作员是否有副作用或其他意外行为?为什么它或者可能被某些人认为是"糟糕的形式"?有没有惯用的选择?
以下是我认为!!可以接受和/或需要的几个例子.
编码练习中的实际代码,这是添加布尔值的一个例子:
while (my $line = <$F>) {
# snip
exists $counts{lines} and $counts{lines} += !! chomp $line;
}
Run Code Online (Sandbox Code Playgroud)使用布尔值作为散列键(显然是简化示例):
sub foo {
my ($input) = @_;
my %responses = ( '' => "False", 1 => "True" );
return $responses{ !! $input };
}
Run Code Online (Sandbox Code Playgroud)在按位运算中使用布尔值,甚至pack():
sub foo {
my ( $a, $b, $c ) = @_;
my $result = !!$a + (!! $b)<<1 + (!! $c)<<2;
return $result;
}
Run Code Online (Sandbox Code Playgroud)您需要进行类型转换以供外部库/进程使用,例如数据库,它只考虑某些值是真实的: …
请考虑以下代码
var value = 0;
for (var i=0; i < arguments.length; i++) {
value += +!!arguments[i];
}
Run Code Online (Sandbox Code Playgroud)
+!!这里到底做了什么?它是JavaScript中的一种好的编程风格吗?