4 回答
TA贡献1802条经验 获得超6个赞
这是进行类型转换的一种非常模糊的方式。
!
是不是。所以!true
IS 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);
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
从非布尔值,可能未定义的值获得的方法确实是通过使用!!
。希望这可笑地清除它。
添加回答
举报