在JavaScript中,"+!!"是什么作用?

5
考虑以下代码:
var value = 0;
for (var i=0; i < arguments.length; i++) {
    value += +!!arguments[i];
}

这里的+!!到底是什么意思?这是JavaScript中的一种好的编程风格吗?

对于未经训练的眼睛来说,这并不容易阅读。可以更好地使用三元运算符。 - seldon
相关:https://dev59.com/jXRA5IYBdhLWcg3w6SRH。 - user663031
实际上,这里并不需要 +,因为加法运算会将布尔型强制转换为数字。 - user663031
3个回答

7
"

!!arguments[i]"是一个常见的习惯用法,它应用了逻辑否定两次,将表达式arguments[i]转换为真正的布尔值。

例如:

console.log(!!{});
// true

我们为什么需要两个逻辑非呢?因为它不会改变数据的奇偶性。例如,如果数据最初是Truthy,那么!Truthy将变为false,然后再次反转!false,你将得到true。如果数据最初是Falsy,那么!Falsy将变为true,然后再次反转!true,你将得到false

+!!arguments[i] 中的 + 运算符是为了确保从布尔值中获取数字值,因为 !!arguments[i] 保证返回布尔值。

在 JavaScript 中,将 true 转换为数字会得到 1,将 false 转换为数字会得到 0

console.log(+true);
// 1
console.log(+false);
// 0

是的,我应该把!!称为惯用语单元,说得好。 - T.J. Crowder
也许你可以发表一下对第二个问题的看法,即“在JavaScript中是否存在一种良好的编程风格?” - user663031

4

不是一个运算符,而是三个:+ 然后两次 !

它的作用是将 arguments[i] 应用于 !,这会将 真值 转换为 false假值 转换为 true,然后再应用 !,使 false => true,反之亦然,然后应用一元 + 将结果转换为数字 (true => 1false => 0)。

假值 是任何强制转换为 false 的值。假值包括 0""NaNnullundefined 和当然,false。除此之外的任何值都是 真值

因此,最终结果是将 arguments 中的真值数量添加到 value 中。

在 JavaScript 中,这是一种好的编程风格吗?

使用 !! 将某些东西转换为真值或假值是完全正常的做法。使用一元 + 将某些东西转换为数字也是完全正常的做法。


好的,为了保持一致性,我建议你开始使用“真值”。 - user663031
@torazaburo:“truthy”和“falsy”并不比“truthy”和“falsey”更相似。它必须是“truy”和“falsy”或“truey”和“falsey”或“truthy”和“falsehoody”。英语是无政府状态的。 - T.J. Crowder

0
通常使用!!将变量转换为布尔类型,使用+将其转换为数字。 在此示例中,它首先被转换为布尔值,然后再转换为数字,即1或0。 变量value包含传递给函数的truthy参数的数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接