为了账号安全,请及时绑定邮箱和手机立即绑定

是什么 !!(不是)JavaScript中的运算符?

是什么 !!(不是)JavaScript中的运算符?

慕姐8265434 2019-05-23 10:47:44
是什么 !!(不是)JavaScript中的运算符?我看到一些代码似乎使用了一个我无法识别的运算符,以两个感叹号的形式出现,如下所示:!!。有人可以告诉我这个运营商的作用吗?我看到这个的背景是,this.vertical = vertical !== undefined ? !!vertical : this.vertical;
查看完整描述

4 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这是进行类型转换的一种非常模糊的方式。

!不是。所以!trueIS false,和!falsetrue!0是的true!1是的false

所以你要将一个值转换为布尔值,然后将其反转,然后再将其反转。

// Maximum Obscurity:val.enabled = !!userId;// Partial Obscurity:val.enabled = (userId != 0) ? true : false;
// And finally, much easier to understand:val.enabled = (userId != 0);


查看完整回答
反对 回复 2019-05-23
?
DIEA

TA贡献1820条经验 获得超2个赞

泡一些茶:

!!不是运营商。它是两用的!- 这是逻辑“非”运算符。


理论上:

! 确定价值不是什么的“真相”:

  • 事实是,这false不是true(这就是为什么会!false导致true

  • 事实是,这true不是false(这就是为什么会!true导致false


!!确定价值不是什么的“真相” :

  • 事实是,这true不是没有 true(这就是为什么会!!true导致true

  • 事实是,这false不是没有 false(这就是为什么会!!false导致false


我们希望在比较中确定的是关于参考值的“真实性” ,而不是参考本身的。有一个用例我们可能想知道一个值的真相,即使我们期望值是false(或假的),或者我们期望值不是typeof boolean


在实践中:

考虑一个简洁的功能,通过动态类型(又名“鸭子打字”)检测功能功能(在这种情况下,平台兼容性)。我们想编写一个函数,true如果用户的浏览器支持HTML5 <audio>元素,则返回该函数,但如果<audio>未定义,我们不希望该函数抛出错误; 我们不想用来try ... catch处理任何可能的错误(因为它们很严重); 而且我们也不想在函数内部使用一个不能一致地揭示该特性的真相的检查(例如,即使不支持HTML5 ,document.createElement('audio')仍会创建一个被调用的元素)。<audio><audio>


以下是三种方法:

// this won't tell us anything about HTML5 `<audio>` as a featurevar foo = function(tag, atr) { return document.createElement(tag)[atr]; }
// this won't return true if the feature is detected (although it works just fine)var bar = function(tag, atr)
 { return !document.createElement(tag)[atr]; }// this is the concise, feature-detecting solution we wantvar baz = function(tag, atr)
  { return !!document.createElement(tag)[atr]; }foo('audio', 'preload'); // returns "auto"bar('audio', 'preload');
   // returns falsebaz('audio', 'preload'); // returns true

每个函数接受a <tag>和a attribute查找的参数,但它们每个都根据比较确定的值返回不同的值。

但等等,还有更多!

你们中的一些人可能已经注意到,在这个具体的例子中,人们可以使用稍微更高效的方法来检查属性,以检查相关对象是否具有属性。有两种方法可以做到这一点:

// the native `hasOwnProperty` methodvar qux = function(tag, atr) { return document.createElement(tag).hasOwnProperty(atr); }
// the `in` operatorvar quux = function(tag, atr) { return atr in document.createElement(tag); }qux('audio', 'preload');  
// returns truequux('audio', 'preload'); // returns true

我们离题了......

无论这些情况多么罕见,可能存在一些场景,其中最简洁,最高性能且因此最优选的true从非布尔值,可能未定义的值获得的方法确实是通过使用!!。希望这可笑地清除它。


查看完整回答
反对 回复 2019-05-23
  • 4 回答
  • 0 关注
  • 866 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信