或许有人说jquery不是过期了吗?怎么还用,但我要告诉你,
没有永恒的库或者框架,只有其中的思想是最宝贵的,也能够结合游戏来说,就是一代版本一代神
因为本人是经过yarn进行下载的,若是没有安装yarn,能够参考后面的连接或者用npm包下载,我使用的命令以下:
yarn add jquery@3.5.1
[注意,这里的jquery的q千万不能大写,我已经掉几回坑了!!!]
安装详细请参考 :npm学习
npmcss
$ npm install -g cnpm --registry=https://registry.npm.taobao.org //cnpm安装 复制代码
yarn官网
yarnnode
安装完成后文件夹以下:jquery
以前写过,可是太匆匆忙忙了,就连解释都没有写了,此次写完整些,
返回值为小写开头的数据类型字母,例如String类型的返回string
var class2type = {};//定义一个空对象 var toString = class2type.toString;//至关于Object.prototype.toString ["Boolean","Number","String","Function","Array","Date","RegExp","Object","Error","Symbol","BigInt","GeneratorFunction"].forEach(item=>{ class2type["[object "+item+"]"] = item.toLowerCase(); //遍历数组为class2type添加属性和对应的值,如class2type[object String]:string }) function toType(obj){ if(obj==null){//排除null和undefined return obj+''; } return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj; } 复制代码
具体以下:npm
用于检测是不是一个函数,返回值为
布尔值
//这里的nodeType是为了解决兼容问题 //在某些浏览器中,typeof对HTML <object>元素返回“function” //(即“文件类型”。createElement("object") === "function" ')。 //咱们不想将*任何* DOM节点分类为函数。 function isFunction(obj){//判断是不是函数 return typeof obj === 'function' && typeof obj.nodeType !== "number"; } 复制代码
用于判断是不是一个window,返回值为
布尔值
//这里巧用了window上面有个window属性 function isWindow(obj){//判断是不是window return obj!=null && obj.window === window; } 复制代码
用于判断是不是纯粹【{},new Object,Object.create(null)】
的对象,返回值为布尔值
var getProto = Object.getPrototypeOf;//获取原型 var hasOwn = class2type.hasOwnProperty;//至关于object.prototype.hasOwnProperty function isPlainObject(obj){//判断是不是纯粹的对象({},new Object,Object.create(null)) var proto = getProto(obj), Ctol; if(!obj || toType(obj)!=="object"){//检测是不是object类型,不是则直接返回false return false } //判断proto上面是否有constructor这个属性,有则直接获取构造器 Ctol = hasOwn.call(ptoto,"constructor") && proto.constructor; return typeof Ctol === "function" && fnToString.call( Ctor ) === ObjectFunctionString; } 复制代码
用于判断是不是一个空对象,返回值为
布尔值
原jq代码 :
数组
//缺陷:没法检测Symbol,以及原型上添加的属性也会被forin循环出来 function isEmptyObject: function( obj ) { var name; for ( name in obj ) {//循环若是有属性则直接返回false return false; } return true; } 复制代码
如图:`咱们是但愿只要当前对象没有属性,则被判断为空对象,而不是原型上有对象也被认为不是空对象浏览器
修改以后
框架
function isEmptyObject(obj){//判断是不是一个空对象 let arr = [ ...Object.getOwnPropertyNames(obj),//获取自身上的属性 ...Object.getOwnPropertySymbols(obj)//获取symbol ] return arr.length > 0; } 复制代码
用于检测是不是类数组或者数组,返回值为
布尔值
function isArrayLike( obj ) { var length = !!obj && "length" in obj && obj.length,//obj存在而且有length属性,则直接回去obj的length type = toType( obj );//前面的检测类型 if ( isFunction( obj ) || isWindow( obj ) ) {//由于函数和对象中也有length属性,因此要排除他们 return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } 复制代码
用于遍历数组或者对象,返回值为
每一项和索引
原jq :
函数
//缺陷不能遍历出symbol function each( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; } 复制代码
如图所示:不能遍历出symbol
工具
修改后 :
post
function getPropertyname(obj){//获取symbol加当前对象的属性,不包括原型上的属性 return [ ...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj) ] } function each( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { let keys = getPropertyname(obj), length = keys.length for(;i<length;i++){ if ( callback.call( obj[keys[i]], i, obj[keys[i]] ) === false ) { break; } } } return obj; } 复制代码
如图所示: