所以,这是预过滤“CHILD”的功能:
function(match){
if ( match[1] === "nth" ) {
// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
// calculate the numbers (first)n+(last) including if they are negative
match[2] = (test[1] + (test[2] || 1)) - 0;
match[3] = test[3] - 0;
}
// TODO: Move to normal caching system
match[0] = done++;
return match;
}
代码摘自line 442-458 of sizzle.js。
那么,为什么行var test = ...
让exec输入一个布尔值?或者这真的是一个字符串?
有人可以通过将其分成几行代码来解释它吗?
答案 0 :(得分:10)
exec
方法将收到一个字符串,因为Boolean Logical Operators可以返回一个操作数,而不一定是Boolean
结果,例如:
逻辑AND 运算符(&&
)将返回第二个操作数的值,如果第一个 truthy :
true && "foo"; // "foo"
如果它本身是 falsy ,它将返回第一个操作数的值:
NaN && "anything"; // NaN
0 && "anything"; // 0
逻辑OR 运算符(||
)将返回第二个操作数的值,如果第一个操作数是 falsy :
false || "bar"; // "bar"
如果它本身是非虚假,它将返回第一个操作数的值:
"foo" || "anything"; // "foo"
Falsy 值为:null
,undefined
,NaN
,0
,零长度字符串,当然还有{{1} }。
在布尔上下文中评估的任何其他内容都是 truthy (将强制转换为false
)。
所以,让我们看一下表达式:
true