- 时间:2022-07-15 00:42 编辑: 来源: 阅读:297
- 扫一扫,手机访问
摘要:JavaScript数据类型判断方法综述
《源码交易平台》
参考:https://www.cnblogs.com/onepixel/p/5126046.html1.typeOf这种方法在开发中经常用来判断数据类型。 返回的数据类型包括以下七种:数字、布尔、符号、字符串、对象、未定义和函数。 我们知道JavaScript有六种基本数据类型:字符串、数字、布尔、符号、未定义和空。 引用类型有对象、数组、日期、正则表达式、函数、错误。 所以可以看出,对于基本类型,除了null,其他类型的判断都可以返回想要的结果。 但是null有自己的类型,typeof返回的结果是object。 console . log(null类型)//引用类型的对象 方法返回除函数的函数类型之外的对象。 引用类型中的数组、日期、正则等也有自己特定的类型,但typeof的求解只返回其原型链顶端的对象类型。 console . log(type of new function())//function console . log(type of new error())//object console . log(type of new regexp())//object 2 . constructor属性我们知道构造函数的prototype对象中有一个constructor属性,指的是构造函数本身。 这个属性也可以用于类型判断。 当我们访问一个对象实例的构造函数属性时,js会查找原型链。 也就是会找到实例的_proto_ property,通过这个属性找到对象原型。 对象原型的构造函数属性指向实例的构造函数。 下面是一个函数Person(){ this . name = ' Xiaoming ' } const Person = new Person()console . log(Person . prototype)console . log(Person)console . log(Person)我们将原型化,构造函数和对象实例分别打印出来。查看constructor.jpg,可以发现对象实例的_proto_指向对象原型,原型的构造函数又指向构造函数。 使用此属性确定下面的类型。 console . log(person . constructor = = person)//true//more const arr =[1,2]console . log(arr . constructor = = array)//true console . log(new error()。constructor = = error)//true注意:null和undefined是无效对象,它们没有constructor属性。 3.Object.prototype.toString这个方法是判断类型最准确的方法。 使用Object的prototype方法(Object.prototype.toString),调用此方法,默认返回当前对象的[[Class]]。 这是[object xxx]形式的内部属性,其中xxx是对象的类型。 对于Object对象,直接调用toString()可以返回[object Object] 对于其他对象,需要调用/应用。 这里应该注意,尽管所有对象的原型链最终都指向Object 调用toString()方法是合理的,但实际上大多数对象都实现了自己的toString()方法。 根据原型链的搜索规则 当对象调用toString时,它将首先访问自己实现的方法。 因此,有必要使用上述方法在对象原型上强制使用toString()方法。 object . prototype . tostring . call(' str '),//[object String]object . prototype . tostring . call(12),//[object Number]object . prototype . tostring . call([1,2]),//[object Array]object . prototype . tostring . call(false),//[object Boolean]object . prototype . tostring . call(Undefined),/[object Undefined]object . prototype . tostring . call(Null),/[object Null]object Null]prototype . tostring . call( 这种方法的准则是:沿原型链检查,确定B是否能在a的原型链上。 下面用例子来说明:constarr = [1,2] console.log(数组的arr实例)//trueconsole.log(对象的arr实例)//truearray,objectd都在数组对象的原型链上,所以都返回true,这反映了一个问题,这个方法只能判断它们是不是实例和构造函数的关系,而不能判断它们的具体类型。 我们知道这个方法的实现原理是判断B是否可以在A的原型链中,所以我们可以自己实现一个instanceof方法。 const myInstanceof = (left,right)= & gt;{//如果(typeof left!= = ' object ' & amp& amp左边的类型!== 'function'||left === null)返回falseLetproto = left。_ _ proto _ _//获取左侧对象的原型let right proto = right.prototype//Get右侧构造函数的原型//Find while(leftProto)在原型链上。{ if(leftProto === rightProto)返回true leftProto = leftProto。_ _ proto _ _ } return false } const arr =[1,2]const foo =()= & gt;{ console . log(' xiaom ')} console . log(myInstanceof(arr,Array))//true console . log(myInstanceof(arr,Object)) // true console . log(myInstanceof(foo,Array))//false console . log(myInstanceof(foo,Function))//true console . log(myInstanceof(foo,Object))//true