JS中检测数据类型的7种方法

112 阅读3分钟

一.JS中的数据类型: 1) 简单类型:String、Number、Boolean、Undefined、Null、Symbol 2)引用(复杂)类型:Object

二、检测数据类型的方法: 1、typeof 检测一些基本的数据类型 语法:typeof 后面加不加括号都是可以用的 注意:正则、{}、[]、null输出结果为object

console.log(typeof /\d/);//object
console.log(typeof {});//object
console.log(typeof []);//object
console.log(typeof (null));//object
console.log(typeof 123);//number
console.log(typeof true);//boolean
console.log(typeof function () {});//function
console.log(typeof (undefined));//undefined

2、A instanceof B检测当前实例是否隶属于某各类 双目运算符 a instanceof b ,判断a的构造器是否为b,返回值为布尔值

function b(){}
let a = new b;
console.log(a instanceof b);//true
console.log(b instanceof Object);//true
let arr = [1,2,3,4];
console.log(arr instanceof Array);//true

3、constructor构造函数 语法:实例.constructor 对象的原型链下(构造函数的原型下)有一个属性,叫constructor 缺点:**constructor并不可靠,容易被修改(只有参考价值)。即使被修改了,也不会影响代码的正常运行。正常开发的时候,constructor不小心被修改了,为了方便维护,和开发,可以手动更正constructor的指向。

function a() {}
let a = new b;
console.log(a.constructor.name);//a
console.log(b.constructor);//Function(){}
console.log(Function.constructor);//Function(){}

4、hasOwnporperty 检测当前属性是否为对象的私有属性 语法: obj.hasOwnporperty(“属性名(K值)”)

例子: let obj = { name:"lxw" }; console.log(obj.hasOwnProperty('name'));//true console.log(obj.hasOwnProperty('lxw'));//false 5、is Array 判断是否为数组

console.log(Array.isArray([]));//true
console.log(Array.isArray(new Array()));//true

6、valueOf 可以看到数据最本质内容(原始值)

例子: let a = "12345"; let b= new String('12345'); console.log(typeof a);//string console.log(typeof b);//object console.log(a == b);//true (typeof检测出来是对象居然和一个数组相等,显然b并不是一个真的对象。) //此时看看 valueOf()的表现 console.log(b.valueOf());//12345 拿到b的原始值是 字符串的12345 console.log(typeof b.valueOf())//string 这才是 b的真正的数据类型 1.Math是个对象,不是类。类才有prototype(原型)。也就是说类都有原型:prototype,对象都有原型链:proto,函数既是类,也是对象,也是函数。 2.如何把对象转换成字符串?  对象下的toString方法是检测数据类型的,而不是用来转化成字符串的,这时可以用JSON的方法来转化

例子: let obj={name:'朱军林'} obj.toString()//=>"[object Object]"

JSON.stringify({name:'朱军林'})//"{"name":"朱军林"}"

7、Object.portotype.toString (最好的) 语法:Object.prototype.toString.call([value]) 获取Object.portotype上的toString方法,让方法的this变为需要检测的数据类型值,并且让这个方法执行

在Number、String、Boolean、Array、Function、RegExp…这些类的原型上都有一个toString方法:这个方法就是把本身的值转化为字符串

例子: (123).toString()//'123' (true).toString()//'true' [12,23].toString()//'12.23'

... 在Object这个类的原型上也有一个方法toString,但是这个方法并不是把值转换成字符串,而是返回当前值得所属类详细信息,固定结构:’[object 所属的类]'

调取的正是Object.prototype.toString方法obj.toString()  首先执行Object.prototype.tostring方法,这个方法中的this就是我们操作的数据值obj

总结:Object.prototype.toString执行的时候返回当前方法中的this的所属类信息,也就是,我想知道谁的所属类信息,我们就把这个toString方法执行,并且让this变为我们检测的这个数据值,那么方法返回的结果就是当前检测这个值得所属类信息

Object.prototype.toString.call(12)//[boject Number]

Object.prototype.toString.call(true)//[boject Boolean]
		                    //"[object Number]"
		                    //"[object String]"
		                    //"[object Object]"
		                    //"[object Function]"
		                    //"[object Undefined]"
		                    //"[object Null]"
		                    //"[object RegExp]"
		                    //"[object Boolean]"