JavaScript双重否定(!!)是招还是麻烦?

因此有人被要求在我的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。

速度测试!

两次否定最快

布尔值vs双重否定

测试者

使用双重否定的原因

有人称其为“ 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值