$ .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 ] );
}
答案 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
,因为我们知道inv
和retVal
都是布尔类型,但始终使用标识是个好习惯操作员,即使是比较操作员也会这样做。