Jquery库的源代码为$ .grep ..!

时间:2012-10-05 12:35:48

标签: javascript jquery web-services

  

可能重复:
  What is the !! (not not) operator in JavaScript?

$ .grep的Jquery Library源代码.....

grep:function(elems,callback,inv){

    var retVal,
        ret = [],
        i = 0,
        length = elems.length;
    inv = !!inv;

    // Go through the array, only saving the items
    // that pass the validator function
    for ( ; i < length; i++ ) {
        retVal = !!callback( elems[ i ], i );
        if ( inv !== retVal ) {
            ret.push( elems[ i ] );
        }
    }

    return ret;
},

在上面的例子中,jquery grep是jquery库的源代码。为什么他将inv作为默认值是未定义的,他改为布尔值,同样的事情 retVal 存储 !!回调并更改为布尔值。 问题是if语句如何工作......?可以给我一些更详细的说明.. !!感谢。

        retVal = !!callback( elems[ i ], i );
        if ( inv !== retVal ) {
            ret.push( elems[ i ] );
        }

1 个答案:

答案 0 :(得分:1)

!是一个一元运算符,它将操作数强制转换为布尔值,然后返回相反的值。把它们中的两个放在一起(!!)你得到一个操作数强制转换为布尔值并且双重否定 - 它是布尔表示。大多数人更喜欢Boolean(val)!!val,因为它更容易理解。

// this calls "callback" and converts the return value to a boolean
retVal = !!callback( elems[ i ], i );
// if the converted return value is not identical to "inv" then... 
if ( inv !== retVal ) {
    // elems[i] is pushed on to the top of the array "ret"
    ret.push( elems[ i ] );
}

请注意,条件inv !== retVal也可以写为inv != retVal,因为我们知道invretVal都是布尔类型,但始终使用标识是个好习惯操作员,即使是比较操作员也会这样做。