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

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

我看到一些代码似乎使用了一个我无法识别的运算符,以两个感叹号的形式出现,如下所示:!!。有人可以告诉我这个运营商的作用吗?

我看到这个的背景是,

this.vertical = vertical !== undefined ? !!vertical : this.vertical;


慕姐8265434
浏览 867回答 4
4回答

呼啦一阵风

这是进行类型转换的一种非常模糊的方式。!是不是。所以!trueIS false,和!false是true。!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);

DIEA

泡一些茶:!!不是运营商。它是两用的!- 这是逻辑“非”运算符。理论上:!&nbsp;确定价值不是什么的“真相”:事实是,这false不是true(这就是为什么会!false导致true)事实是,这true不是false(这就是为什么会!true导致false)!!确定价值不是什么的“真相”&nbsp;:事实是,这true不是没有&nbsp;true(这就是为什么会!!true导致true)事实是,这false不是没有&nbsp;false(这就是为什么会!!false导致false)我们希望在比较中确定的是关于参考值的“真实性”&nbsp;,而不是参考本身的值。有一个用例我们可能想知道一个值的真相,即使我们期望值是false(或假的),或者我们期望值不是typeof&nbsp;boolean。在实践中:考虑一个简洁的功能,通过动态类型(又名“鸭子打字”)检测功能功能(在这种情况下,平台兼容性)。我们想编写一个函数,true如果用户的浏览器支持HTML5&nbsp;<audio>元素,则返回该函数,但如果<audio>未定义,我们不希望该函数抛出错误;&nbsp;我们不想用来try ... catch处理任何可能的错误(因为它们很严重);&nbsp;而且我们也不想在函数内部使用一个不能一致地揭示该特性的真相的检查(例如,即使不支持HTML5&nbsp;,document.createElement('audio')仍会创建一个被调用的元素)。<audio><audio>以下是三种方法://&nbsp;this&nbsp;won't&nbsp;tell&nbsp;us&nbsp;anything&nbsp;about&nbsp;HTML5&nbsp;`<audio>`&nbsp;as&nbsp;a&nbsp;featurevar&nbsp;foo&nbsp;=&nbsp;function(tag,&nbsp;atr)&nbsp;{&nbsp;return&nbsp;document.createElement(tag)[atr];&nbsp;} //&nbsp;this&nbsp;won't&nbsp;return&nbsp;true&nbsp;if&nbsp;the&nbsp;feature&nbsp;is&nbsp;detected&nbsp;(although&nbsp;it&nbsp;works&nbsp;just&nbsp;fine)var&nbsp;bar&nbsp;=&nbsp;function(tag,&nbsp;atr) &nbsp;{&nbsp;return&nbsp;!document.createElement(tag)[atr];&nbsp;}//&nbsp;this&nbsp;is&nbsp;the&nbsp;concise,&nbsp;feature-detecting&nbsp;solution&nbsp;we&nbsp;wantvar&nbsp;baz&nbsp;=&nbsp;function(tag,&nbsp;atr) &nbsp;&nbsp;{&nbsp;return&nbsp;!!document.createElement(tag)[atr];&nbsp;}foo('audio',&nbsp;'preload');&nbsp;//&nbsp;returns&nbsp;"auto"bar('audio',&nbsp;'preload'); &nbsp;&nbsp;&nbsp;//&nbsp;returns&nbsp;falsebaz('audio',&nbsp;'preload');&nbsp;//&nbsp;returns&nbsp;true每个函数接受a&nbsp;<tag>和a&nbsp;attribute查找的参数,但它们每个都根据比较确定的值返回不同的值。但等等,还有更多!你们中的一些人可能已经注意到,在这个具体的例子中,人们可以使用稍微更高效的方法来检查属性,以检查相关对象是否具有属性。有两种方法可以做到这一点://&nbsp;the&nbsp;native&nbsp;`hasOwnProperty`&nbsp;methodvar&nbsp;qux&nbsp;=&nbsp;function(tag,&nbsp;atr)&nbsp;{&nbsp;return&nbsp;document.createElement(tag).hasOwnProperty(atr);&nbsp;} //&nbsp;the&nbsp;`in`&nbsp;operatorvar&nbsp;quux&nbsp;=&nbsp;function(tag,&nbsp;atr)&nbsp;{&nbsp;return&nbsp;atr&nbsp;in&nbsp;document.createElement(tag);&nbsp;}qux('audio',&nbsp;'preload');&nbsp;&nbsp; //&nbsp;returns&nbsp;truequux('audio',&nbsp;'preload');&nbsp;//&nbsp;returns&nbsp;true我们离题了......无论这些情况多么罕见,可能存在一些场景,其中最简洁,最高性能且因此最优选的true从非布尔值,可能未定义的值获得的方法确实是通过使用!!。希望这可笑地清除它。
打开App,查看更多内容
随时随地看视频慕课网APP