jQuery源码中的一些细节分析
程序员文章站
2022-07-14 18:06:21
...
!!的使用
var length = !!obj && "length" in obj && obj.length
这是jQuery里的isArrayLike函数里的一句话,用来返回该函数的参数obj是否有length属性,如果有length属性的值是多少。需要注意的是在这个一连串的判断中第一个判断条件用了!!obj而不是obj。
其实两者的作用类似,都是为了排除obj是undefined、null、NaN等六种为false的情况,但是这里选择了使用!!obj的原因是什么呢?我们需要联系下面的代码来看:
return type === "array" || length === 0 ||typeof length === "number" && length > 0 && ( length - 1 ) in obj;
这一串代码就是这个函数的返回值,里面有一个length === 0的判断,也就是判断如果这个obj为一个空数组[ ]或者是一个只有一个length属性并且为0的时候就可以返回true。但是如果在前面使用了obj而不是!!obj,那么当obj为0的时候length的值将会也为0,这里的判断就会有问题。
function isArrayLike()的一些问题
var length = !!obj && "length" in obj && obj.length,
type = toType( obj );
if ( isFunction( obj ) || isWindow( obj ) ) {
return false;
}
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
这是jQuery的函数的源代码,就是上面提到的函数,主要有两个问题:
一"length" in obj
,这个语句在应用到“ ”定义的字符串的时候会报错:Typeerror:cannot use ‘in’ operator to search……这主要是因为in操作符要求右端为对象,而“”定义字符串并不是一个字符串对象,相对的如果是使用new String定义的就没有问题。
二
return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj
这个语句在遇到obj={length:0,……},这样的length属性为零但仍有其他属性值存在的时候仍然会判断为true。