欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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。