因此有人被要求在我的JavaScript Shorthands Techniques帖子中包括一些双重否定比较运算符 ,并决定仔细研究一下我们是否可以在代码中更频繁地使用它。 请参阅下面的速度测试 。
!! 不是运算符。 只是! 操作员两次
例子:
success = !!what()&&that()
return !!value
var x = "somevalue"var isNotEmpty = !!x.length;
Let's break it to pieces:
x.length // 9
!x.length // false
!!x.length // true
以下值与条件语句中的false等效:
* false
* null
* undefined
* The empty string "" ( '')
* The number 0
* The number NaN
所有其他值都等于true。
!!false === false
!!true === true
!!0 === false!!parseInt("foo") === false // NaN is falsy
!!1 === true
!!-1 === true // -1 is truthy
!!"" === false // empty string is falsy
!!"foo" === true // non-empty string is truthy
!!"false" === true // ...even if it contains a falsy value
!!window.foo === false // undefined is falsy
!!null === false // null is falsy
!!{} === true // an (empty) object is truthy
!![] === true // an (empty) array is truthy; PHP programmers beware!
您还可以使用与基本类型相对应的构造函数(不使用new)显式转换值,即
Boolean(foo) === !!foo
Number(foo) === +foo
String(foo) === ''+foo
还有更多示例!
return !!window; //Returns true
return !!null; //Returns false
return !!undefined; //Returns false
return !!false; //Returns false
return !!true; //Returns true
return !!""; //Returns false
return !!"Hi"; //Returns true
return !!0; //Returns false
return !!1; //Returns true
第一个否定将数据(无论数据类型如何)转换为布尔值。 第二个否定再次更改布尔值以提供所需的结果。 负数情况如果值是null / undefined / false /”” / 0,则第一个否定值会将其转换为true。 第二个否定将其更改为false。
积极案例
如果值是object / true /“ Value” / 1,则第一个否定值会将其转换为false。 第二个否定将其更改为true。
是双重否定!!(expr)与Typecasting Boolean(expr)相同
是。
Boolean(5) === !!5; Same casting, fewer characters.
但是说,看看这个! 脑子疼吗?
!!new Boolean(false) // true
!!Boolean(false) // false
瞧,解释:
new Boolean(false)是一个对象,即使该对象包含虚假值,它也是真实的!
Boolean(false)返回原始的false。
速度测试!
使用双重否定的原因
有人称其为“ Javascript双重否定技巧”。 本质上,它将值(空,未定义,对象等)转换为原始布尔值。 类似于显式使用Boolean(value)进行类型转换,不同之处在于这会将值转换为Bololean对象,并且不是真正的布尔值。 双重否定技巧可用于确保在基于某些条件返回布尔值的方法中,返回值始终为布尔类型。
反对使用双重否定的理由
难以阅读和理解。 这是进行类型转换的令人费解的方法。 ! 不是。 所以!true为false,而!false为true。 !0为真,!1为假。
// Maximum Obscurity:
val.enabled = !!userId;
// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;
// And finally, much easier to understand:
val.enabled = (userId != 0);
现实世界中的双重否定
Google Closure编译器
值得一提的是,某些缩小器(例如Google的Closure Compiler)将true转换为!0,将false转换为!1以保存字符(请注意,顺序看起来很尴尬但正确,!0 === true &&!1 === false)。
检测HTML5功能支持
我们想编写一个函数,如果用户的浏览器支持HTML5,则该函数返回true
// this won't tell us anything about HTML5 `
进一步阅读:
Javascript双重否定技巧
双按位非(~~)
http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript
From: https://www.sitepoint.com/javascript-double-negation-trick-trouble/