js基础(二):构造函数与原型html
let obj = {} // 1.Object.prototype.toString if (Object.prototype.toString.call(obj) === '[Object Object]') { console.log('对象!') } // 2.constructor if (obj.constructor === Object) { console.log('对象!') } // 3.$.type() if ($.type(obj) === 'object') { console.log('对象!') } // 4.$.isPlainObject() , 用于判断指定参数是不是一个纯粹的对象 if ($.isPlainObject(obj) === 'object') { console.log('对象!') }
let obj = {} // 1.JSON if (JSON.stringify(obj) === '{}') { console.log('空对象!') } // 2.Object.keys(), es6方法会返回一个由一个给定对象的自身可枚举属性组成的数组 if (Object.keys(obj).length === 0) { console.log('空对象!') } // 3.循环 for (var i in obj) { return true // 不为空 } return false // 空对象 // 4. $.isEmptyObject(), 该对象没有属性能够经过for...in迭代 if ($.isEmptyObject(obj)) { console.log('空对象!') }
let arr = [] // 1.Object.prototype.toString if (Object.prototype.toString.call(arr) === '[object Array]') { console.log('数组!') } // 2.constructor if (arr.constructor === Array) { console.log('数组!') } // 3.$.type() if ($.type(arr) === 'array') { console.log('数组!') } // 4.Array.isArray, 当检测Array实例时, Array.isArray 优于 instanceof,由于Array.isArray能检测iframes if (arr instanceof Array === true) { console.log('数组!') } //Array.isArray是ES 5.1推出的,不支持IE6~8。假如不存在 Array.isArray(),则在其余代码以前运行下面的代码将建立该方法 if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } // 5.instanceof if (arr instanceof Array === true) { console.log('数组!') }
let arr = [] // 1.length,简易版,已知为数组 if (arr && arr.length > 0) { console.log('不为空数组!') } else { console.log('空数组!') } // 2.Object.prototype.isPrototypeOf,测试一个对象是否存在于另外一个对象的原型链上 if (Object.prototype.isPrototypeOf(arr) && Object.keys(arr).length === 0) { console.log('空数组!') } // 3.Array.isArray,一样存在兼容问题 if (Array.isArray(arr) && arr.length === 0) { console.log('空数组!') }
function isJSON(str) { if (typeof str == 'string') { try { var obj=JSON.parse(str); if(typeof obj == 'object' && obj ){ return true; // 可转 }else{ return false;// 不可转 } } catch() { return false; // 不可转 } } console.log('It is not a string!') }
let num = '3' // 1.isNaN, null、空格以及空串会被按照0来处理 if ((!isNaN(num)) && num != null && num != '') { console.log('num为数字!') } // 2.正则 function isNumber(val) { var regPos = /^\d+(\.\d+)?$/; //非负浮点数 var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数 if(regPos.test(val) || regNeg.test(val)) { return true; } else { return false; } }
// jquery源码推荐写法,省代码 var obj = {} if(obj.a == null) { //至关于obj.a === null || obj.a === undefined }
操做符返回一个字符串,表示未经计算的操做数的类型,用于除null、对象和数组以外的通用类型的判断方法jquery
原生原型扩展函数,用来精确的区分数据类型,万能es6
用于肯定JavaScript内置对象的类型,并返回小写形式的类型名称,万能json
该运算符用于测试构造函数的prototype属性是否出如今对象的原型链中的任何位置,用于检测引用类型的判断方法,针对Array和RegExp进行判断。segmentfault
该属性返回对建立此对象的数组函数的引用,每一个具备原型的对象都会自动得到constructor属性。数组
注意: 类继承时的问题函数
function A(){}; function B(){}; A.prototype = new B(); //A继承自B var aObj = new A(); alert(aobj.constructor === B) //true; alert(aobj.constructor === A) //false; //instanceof方法中对象直接继承和间接继承的都会报true alert(aobj instanceof B) //true; alert(aobj instanceof A) // true; //解决construtor的问题一般是让对象的constructor手动指向本身 aobj.constructor = A; //将本身的类赋值给对象的constructor属性 alert(aobj.constructor === A) // true; alert(aobj.constructor === B) // false;基类不会报true了;
原博:https://blog.csdn.net/u011684...测试
参考:typeof,instanceof,$.type][9],[$.isPlainObject(),判断为jsonspa