在javascript中有时会看到有两个!!的用法,有点意思啊,Google后如梦初醒
Js代码 :
var foo;
alert(!foo);//undifined情况下,一个感叹号返回的是true;
alert(!goo);//null情况下,一个感叹号返回的也是true;
var o={flag:true};
var test=!!o.flag;//等效于var test=o.flag||false;
alert(test);
这段例子,演示了在undifined和null时,用一个感叹号返回的都是true,用两个感叹号返回的就是false,所以两个感叹号的作用就在于,如果明确设置了变量的值(非null/undifined/0/""等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。
这一点和jq中的grep 方法比较像:
grep: function( elems, callback, inv ) {
var ret = [], retVal;
inv = !!inv;
// Go through the array, only saving the items
// that pass the validator function
for ( var i = 0, length = elems.length; i < length; i++ ) {
retVal = !!callback( elems[ i ], i );
if ( inv !== retVal ) {
ret.push( elems[ i ] );
}
}
return ret;
}
这是jquery中一个比较经典的例子,
在使用grep函数的时候,如果给出了第三个参数且非null/undefined/0""/等值,则inv为true,否则为false。
这样做的目的就是保证inv和retVal的值都只能在true/false中取,而非其它值,为后续判断提供便利。
简而言之,判断根本如下
扫描二维码关注公众号,回复:
4138415 查看本文章
var o = {flag : false};
o.flag == false;
!o.flag == true;
!! o.flag == false == o.flag;
var o = {flag : true};
o.flag == true;
!o.flag == false;
!! o.flag == true == o.flag;
双逻辑非操作,会把一个值(数字,字符串…..)转换为布尔值。第一次逻辑非操作取反的布尔,第二次获得最初元素本身对应的布尔。使用双逻辑非操作符得到布尔值,比先储存后访问的效果更好,这里先储存说的就是先储存布尔值。