- var deletedIds = [];
- var slice = deletedIds.slice;
- var concat = deletedIds.concat;
- var push = deletedIds.push;
- var indexOf = deletedIds.indexOf;
- var class2type = {};
- var toString = class2type.toString;
- var hasOwn = class2type.hasOwnProperty;
- var trim = "".trim;
- var support = {};
class2type[ toString.call(obj) ] || "object" 为什么很多都是使用call来调用?
var arr = [];
方式一:arr.concat();
方式二:core_concat.call(arr);
方式三:core_concat.apply(arr);
思考下边2个问题:
- jQuery为什么要先把这些方法存储起来?---------------------在压缩中更加节省空间
- jQuery为什么要采用方式二或者三,而不直接使用方式一的做法
nodejser在评论中也给出了另一种答案:
var obj = {};
此时调用obj.concat是非法的,但是如果jQuery采用上边方式二或者三的话,能够解决这个问题。
也即是让类数组也能用到数组的方法(这就是call跟apply带来的另一种用法),尤其在jQuery里边引用一些DOM对象时,也能完美的用这个方法去解决,妙!
使用原生的方法,可以提高页面的速度,但是原生的属性可不见得?以下是jq对typeof方法的改写
- type: function( obj ) {
- if ( obj == null ) {
- return obj + "";//"null"
- }
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call(obj) ] || "object" :
- typeof obj;
- }
修改了typeof null为"object"的错误和typeof function(){} 为 "object"的bug