Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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
双不(!!)vs JavaScript中的类型强制_Javascript_Type Conversion_Not Operator - Fatal编程技术网

双不(!!)vs JavaScript中的类型强制

双不(!!)vs JavaScript中的类型强制,javascript,type-conversion,not-operator,Javascript,Type Conversion,Not Operator,在JavaScript中使用double not运算符除了表示显式转换之外,还有什么好处吗?现在,人们似乎经常喜欢使用double-not来检查是否存在新的API,但我从来没有读过它的任何优点 if(!!window.File) // The File API is supported. else // Your browser sucks. 我读过的一件事是,它是一种简洁、晦涩的方式,可以将cast类型转换为boolean,但是,当在这种上下文中使用时,对象将自动强制转换为b

在JavaScript中使用double not运算符除了表示显式转换之外,还有什么好处吗?现在,人们似乎经常喜欢使用double-not来检查是否存在新的API,但我从来没有读过它的任何优点

if(!!window.File)
    // The File API is supported.
else
    // Your browser sucks.
我读过的一件事是,它是一种简洁、晦涩的方式,可以将cast类型转换为boolean,但是,当在这种上下文中使用时,对象将自动强制转换为boolean,因为我们正在检查它是否已定义


简而言之,为什么人们要在引擎的顶部执行两个布尔运算?

您不需要使用
if
表达式中。
它用于将值转换为布尔值,默认情况下,
if
会执行此操作

var x = ""; // a falsy value
!x // true
!!x // false

if (x) === if (!!x)

我真的看不出有什么理由像你现在这样做。它不会以任何方式影响结果

我唯一认为这是个好主意的时候是,如果你正在构建一个应该返回bool值的函数,你需要从其他值中转换它,例如

function isNotFalsy(val) { return !!val; }

这个例子可能有点强迫,但你明白了。您总是希望确保返回值是用户期望的类型。

如链接所示,它全局转换为布尔值。在这里,它主要是为了使代码更具可读性,这意味着只需要布尔值!!伪运算符有,这不是我要问的。它没有真正的用途,这是一个不好的习惯,因为它有借口可读性。你有我,所以现在唯一的问题是为什么它如此常用。@watkinsj它对坚持实际布尔值
true
false
值的API很有用(像一些jQuery API),而不仅仅是一个以后要铸造的价值。有时带有可选参数的API使用
typeof
来计算一组特定参数的含义,因此如果需要传入一个真正的布尔值,
是一种快速(而且非常安全)的方法。这是一个习惯用法,任何有经验的JavaScript开发人员都应该熟悉这个习惯用法。感谢您的回答,但我知道这一点。问题是在if语句中使用它是否有任何好处,因为这是一种常见的做法。@watkinsj。我相信我在第一行回答了这个问题……你说没有必要。我在问题中指出了这一点。在if语句中,我看不到任何关于其扩散的优势或解释的答案。@watkinsj。没有,这就是为什么我没有写它们的原因…@watkinsj这只是一个坏习惯。不良行为有被广泛使用的趋势。没有比这更深刻的含义了。被认为是最好的,我想指出@Pointy一些API可能会===/typeof需要布尔值。