jquery源码中有很多精妙的实现,对于我们每天都在使用的东西,一定要知其原理,如果遇到不能使用jquery环境,也能自己封装原生的代码实现。
1.检测类型
众所周知typeof 不能用来检测数据,会返回object,而instanceof和constructor在使用跨页面调用时(iframe子页面调用父页面),两个页面的构造器函数引用不相等会判断不准确。
而Object对象原型中的toString方法隐藏了这个实现,把它挖掘出来:
Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/, '$1').toLowerCase();
2.extend扩展对象
最简单的是用for..in遍历一下A对象,赋值给B对象,不过jquery的extend可以传无限多个参数进行合并,自然是用到了arguments对象
var extend = function(out) {
out = out || {};
for (var i = 1; i < arguments.length; i++) {
if (!arguments[i])
continue;
for (var key in arguments[i]) {
if (arguments[i].hasOwnProperty(key))
out[key] = arguments[i][key];
}
}
return out;
};
extend({}, objA, objB);
3.数组的一些工具方法
1)makeArray :可以用Array.prototype.concat.call(obj);
2) each:可以用es5的forEach,兼容低IE就自己for循环了
3) grep:用es5的filter实现
4) inArray:用es5的indexOf实现