DIEA
泡一些茶:!!不是运营商。它是两用的!- 这是逻辑“非”运算符。理论上:! 确定价值不是什么的“真相”:事实是,这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从非布尔值,可能未定义的值获得的方法确实是通过使用!!。希望这可笑地清除它。