JS 判断数据类型的9种方法 |
您所在的位置:网站首页 › js数据类型有哪些怎么判断数据类型的方法 › JS 判断数据类型的9种方法 |
JS 的数据类型检测是一道经典的八股文面试题。相信大家都能条件反射的回答出 4 种方法:typeof、constructor、instanceof 和 Object.prototype.toString,并且对它们各自的优缺点也是张口就来。 本文对这些方法做了简单归纳,同时又补充了其他 5 种和数据类型检测有关的方法,供诸君食用。 typeof:检测基础数据类型和函数很好用typeof 应该是我学习到的第一个 JS 的方法,也是使用频率最高的一个用来检测数据类型的方法。 它能准确判断出的数据类型有:Number,String,Boolean,Undefined,Symbol,BigInt,Function。 它的缺点就是不能准确判断 null 的类型,而是返回 “object”。对于数组,日期,普通对象等数据,统一返回 “object”。 所以在判断基本数据类型(除了 null)和函数类型时,都会使用它。 constructor:返回实例对象的构造函数学习 JS 到面向对象的阶段时,会学到 JS 的原型链和原型对象,会学到通过 new 一个构造函数,来创建实例对象。 构造函数的原型对象上会有一个 constructor 属性,指向了构造函数自身,所以实例对象通过原型链访问 constructor 属性,就能找到自己的构造函数,也就是自己的类型了。 它的本意是用来标识自己的构造函数,却临时拉来当壮丁,用来判断数据类型,当然也存在一定的风险: null,undefined 没有构造函数,自然也就访问不到该属性,因此不能使用此属性来判断 constructor 可以被改写,所以不一定准确来看几个例子: console.log((1).constructor === Number) // true console.log([1, 2, 3].constructor === Array) // true console.log(undefined.constructor === Array) // 报错在平时写代码时,基本上不会用它来做数据类型的检测。 instanceof:沿着原型链去找它和 constructor 一样,也是临时拉来当壮丁。它的作用是检测实例对象是不是属于某个构造函数,可以用来做数据类型的检测。 术业有专攻,所以它也有缺点: 不能检测基本数据类型 原型链可能被修改,导致检测结果不准确 只要能在原型链上找到构造函数,就返回 true,所以类型可能不准确来看几个例子: console.log(1 instanceof Number) // false console.log([] instanceof Array) // true console.log([] instanceof Object) // true实际中 instanceof 也很少用。 Object.prototype.toString:是个大拿看名字它是用来将一个值转为字符串的,但其实并不是,它是一个专门检测数据类型的方法。 它返回的值是一个形如 [object Object] 的字符串,比如: console.log(toString.call('123')) // [object String] console.log(toString.call(null)) // [object Null] console.log(toString.call(true)) // [object Boolean] console.log(toString.call({ })) // [object Object] console.log(toString.call([])) // [object Array] console.log(toString.call(function(){ })) // [object Function] console.log(toString.call(new Map)) // [object Map] console.log(toString.call(new WeakSet)) // [object WeakSet]通常会编写一个函数,对返回的字符串从第8位做一个截取,截取到倒数第一位,再去做类型比较。 Symbol.toStringTag:自定义类型上面的 Object.prototype.toString 方法,之所以对不同的数据类型,返回不同的标识字符串,就是因为 Symbol.toStringTag 。 Symbol.toStringTag 是一个内置符号属性,它的值是一个字符串,用于表示一个对象的默认描述,也就是调用 Object.prototype.toString 会返回的内容,比如: let obj = { } obj[Symbol.toStringTag] = 'ABC' console.log(Object.prototype.toString.call(obj)) // [object ABC]对于自定义对象,调用上面的方法,都只会返回 [object Object]。此时就可以使用 Symbol.toStringTag 来指定一个确定的类型了,比如: class Person{ get[Symbol.toStringTag](){ return 'Person' } } let person = new Person() console.log(Object.prototype.toString.call(person)) // [object Person] Object.prototype.isPrototypeOf:和 instanceof 类似isPrototypeOf 和 instanceof 类似,都是基于原型链和原型对象去做判断的。它用来检查一个对象是否存在于另一个对象的原型链上。 function Person() { } let person = new Person() console.log(Person.prototype.isPrototypeOf(person)) Array.isArray:专业检测数组三十年起初以为它是 ES6 提供的新方法,后来得知其实属于 ES 5.1 规范。 看名字就知道,它是专门用于检测数组类型的,该方法的命名真实言简意赅。 Array.isArray([]) // true Number.isNaN:完善window.isNaN这个方法就是真的属于 ES6 标准了。 我们知道,JS 中有一个特殊的“数字” NaN,表示 not a number,不是一个数字,但它却归属于数字类型: console.log(typeof NaN) // 'number'NaN 用于表示不是一个数字,它不等于任何值,包括它本身。在 ES6 之前,window 对象提供了一个全局方法 isNaN,用于判断一个数字是不是 NaN: isNaN(10) // false isNaN('abc') // true isNaN(NaN) // true可以发现,isNaN 对于字符串的检测结果也是 NaN。但这其实并不严谨,它对要判断的数据做了一个隐式类型转换,先转为数字再进行判断。而NaN 的检测应该仅限于数字类型,所以 ES6 提供了 Number.isNaN 方法: Number.isNaN(NaN) // true Number.isNaN('123') // false它能判断一个值是否严格等于NaN。 等比较:与固定值进行比较直接通过与一个特定的值进行比较,从而判断数据的类型,比如: let value = null console.log(value === null) // true // 同时判断一个值是 undefined 或者 null let value console.log(value == null) // true 数据类型检测库推荐 总结本文整理了 JS 中常用的判断数据类型的方法,其中 typeof 和 Object.prototype.toString 使用场景是最多的,对一些特殊的数据类型,比如 null,NaN,自定义类型,可以选择其他的方式去进行判断,做到灵活运用。 关于数据类型的检测, 如果你还有其他的方式,欢迎评论补充,一起学习。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |