一、Object作为构造函数使用时,可以接收一个参数,
1.如果这个参数是原始类型的值时则返回改值这个值对应的包装对象
Object(123); // Number {[[PrimitiveValue]]: 123}
2.如果这个参数是一个对象,那么直接返回传入对象
Object({ name:‘创一代‘ }); // Object {name: "创一代"}
然后可以利用接收一个对象返回原对象的特性就可以判断变量是否是对象类型
/** * 判断变量是否是一个对象 * @param value * 传入参数 * @returns {boolean} true:value是对象,反之不是对象 */ function isObject(value) { return value === Object(value) } console.log(isObject([1,2])) // true console.log(isObject({name:‘创一代‘})) // true
二、Object.prototype.toString可以得到一个实例对象的构造函数,为了防止小伙伴在对象上自定义toString方法覆盖掉Object.prototype.toString,我们通过函数的call方法可以在任意值上调用Object.prototype.toString方法,如此我们可以来写一个比typeof更牛逼的类型判断函数
/** * 传任意参数返回参数类型 * @param value * @returns {string} 返回值都是字符串,和typeof一样 */ function getType(value) { var o = Object.prototype.toString.call(value) return o.match(/\[object (.*)\]/)[1].toLowerCase() } getType(1) // "number" getType(‘null‘) // "string" getType(null) // "null" getType({}) // "object" getType(function(){}) // "function" getType(new Date()) // "date" getType() // "undefined" getType(/创一代/) // "regexp"getType([]) // "array"
三、好了,有了获取数据类型的函数之后呢,我们写一个专门用于判断某种数据类型的功能,事先用文字描述再下手写代码
1、先举个例子,比如说判断一个对象是否是数组?我们可以用Array.isArray(arr)来判断
var arr = []; Array.isArray(arr); // true
2、好,那么我们就getType方法加上isXXX方法
3、isXXX方法我们不可能一个一个的写,所以我们的XXX方法应该是一个数组或者是个JSON对象,可以配置,我们这里呢就直接定义一个数组吧,数组名为type
/** * 准备类型数据 * @type {string[]} */ var type = [‘Null‘, ‘Undefined‘, ‘Object‘, ‘Array‘, ‘String‘, ‘Number‘, ‘Boolean‘, ‘Function‘, ‘RegExp‘,‘Infinite‘ ];
4、想办法来实现类似于:getType.isXXX(value);getType是个方法,方法本身也是一个对象,访问对象属性的方式有两种(我知道的就两种哈),那就是点(".")操作符和类似访问数组元素的"[]",[]操作符有个好处就是属性名可是动态的也可以是不规范的,在这里我们的属性刚好是动态加上去的,所以我们利用这些便利来构建我们getType.isXXX(value)
5、可能上面的说的有点乱哈,基本上就这些思路,下面用代码实现
type.forEach(function (t) { /** * 用于判断某种数据类型 * @param o * 待判断的变量 * @returns {boolean} * 判断结果,true/false */ getType[‘is‘ + t] = function (o) { return getType(o) === t.toLowerCase() } })
getType.isArray([]) // truegetType.isArray({}) // falsegetType.isUndefined() // truegetType.isUndefined(1) // false
时间: 2024-11-06 12:45:01