当前位置: 首页 > Web前端 > JavaScript

数据类型的判断方式以及转换方式的汇总

时间:2023-03-26 21:58:19 JavaScript

数据类型判断方法和转换方法总结常见面试题数据类型检测方法一:typeoftypeof常用于判断基本数据类型,判断引用类型时会出现bugtypeofnull,会输出object,但这是只是JS长期存在的一个bug,并不代表null是引用数据类型,null本身也不是不能判断对象引用数据类型。如果用typeof判断,除了function会判断正确,其余都是'object',typeof1//'number'typeof'1'//'string'typeofundefined//'undefined'typeoftrue//'boolean'typeofSymbol()//'symbol'typeofnull//'object'typeof[]//'object'typeof{}//'object'typeofconsole//'object''typeofconsole.log//'function'方法2:instanceofinstanceof常用于判断引用数据类型instanceof运算符用于检测构造函数的prototype属性是否出现在实例对象的原型链上。letCar=function(){}letbenz=newCar()benzinstanceofCar//trueletcar=newString('MercedesBenz')carinstanceofString//trueletstr='Covid-19'strinstanceofString//false手写的instaneof先用typeof判断基本数据类型,如果是则直接返回false得到参数的原型对象,循环往下查找判断,直到找到相同的原型对象functionmyInstanceof(left,right){//这里先用typeof判断基本数据类型,如果是则直接返回falseif(typeofleft!=='object'||left===null)returnfalse;//getProtypeOf是Object对象自带的API,可以获取参数Prototype对象letproto=Object.getPrototypeOf(left);while(true){//向下循环寻找相同的原型对象if(proto===null)returnfalse;if(proto===right.prototype)returntrue;//找到相同的原型对象,返回trueproto=Object.getPrototypeof(proto);}}//验证自己实现的myInstanceof是否OKconsole.log(myInstanceof(newNumber(123),Number));//trueconsole.log(myInstanceof(123,Number));//falseinstanceof可以准确判断复杂的引用数据类型,但不能正确判断基本数据类型;而typeof也有缺点,虽然可以判断基本数据类型(null除外),但是在引用数据类型中,除了函数类型,其他的都判断不了。方法三:Object.prototype.toStringtoString()是Object的原型方法。调用该方法可以统一返回一个字符串,格式为“[objectXxx]”,其中Xxx为对象的类型。对于Object对象,直接调用toString()就能返回[objectObject];而对于其他对象,则需要通过调用Object.prototype.toString({})//"[objectObject]"Object.prototype.toString.call({})//同上结果,加上callokObject.prototype.toString.call(1)//"[objectNumber]"Object.prototype.toString.call('1')//"[objectString]"Object.prototype.toString.call(true)//"[objectBoolean]"Object.prototype.toString.call(function(){})//"[objectFunction]"Object.prototype.toString.call(null)//[objectNull]"Object.prototype.toString.call(undefined)//"[objectUndefined]"Object.prototype.toString.call(/123/g)//"[objectRegExp]"Object.prototype.toString.call(newDate())//“[对象日期]”Object.prototype.toString.call([])//“[对象数组]”Object.prototype.toString.call(文档)//“[objectHTMLDocument]”Object.prototype.toString.call(window)//“[objectWindow]》最优解:手写一个全局通用判断方法原理:先判断是否是基本类型,如果是,则直接返回类型如果是对象类型,使用Object.prototype.toString判断方法,并进行正则匹配functiongetType(obj){lettype=typeofobj;if(type!=="object"){//先进行typeof判断,如果是基本数据类型,直接returnreturntype;}//对于typeof返回结果为object,则进行下面的判断,正则返回结果returnObject.prototype.toString.call(obj).replace(/^\[object(\S+)\]$/,'$1');//注意正则表达式中间有一个空格}/*代码校验需要注意大小写,哪些是通过typeof判断的,哪些是通过toString判断的?想想看*/getType([])//"Array"typeof[]是对象,所以toStringreturnsgetType('123')//"string"typeof直接返回getType(window)//"Window"toStringreturnsgetType(null)//"Null"为大写,typeofnull为对象,需要toString判断getType(undefined)//"undefined"typeof直接返回getType()//"undefined"typeof直接返回getType(function(){})//"function"typeof可以判断,所以首字母小写getType(/123/g)//"RegExp"toString先返回类型转换来个小题,体会'123'==123//假的还是真的?''==null//falseo是真的吗?''==0//假还是真?[]==0//假还是真?[]==''//假还是真?[]==![]//是假还是真?null==undefined//假还是真?Number(null)//返回什么?Number('')//返回什么?parseInt('');//返回什么?{}+10//返回什么?让obj={[Symbol.toPrimitive](){返回200;},valueOf(){返回300;},toString(){返回'你好';}}console.log(obj+200);//在这里打印出来了多少?答案在最下面,看你能投多少。转换包括Number()、parseInt()、parseFloat()、toString()、String()、Boolean()。隐式类型转换都是通过逻辑操作。运算符&&、||、!、运算符+、-、*、/、关系运算符>、<、<=、>=、相等运算符==或if/while条件运算被认为是隐式类型转换的几种隐式类型转换规则==和+如果==的隐式类型转换规则相同,则不需要进行类型转换;如果其中一个操作数值为null或undefined,那么另一个操作符必须为null或undefined,将返回true,否则都将返回false;如果其中之一是Symbol类型,则返回false;如果两个操作值都是string和number类型,那么会把string转为number;如果一个运算值是布尔值,则转换为数字;如果操作值是object另一边是string,numberorsymbol,把object转换成原来的类型再判断(调用object的valueOf/toString方法转换)null==undefined//truerule2null==0//falserule2''==null//falserule2''==0//truerule4将string转换为Number然后比较'123'==123//truerule4将string转换为Number然后比较0==false//trueeruleBoolean类型隐式转换为Number然后比较1==true//trueeruleBoolean类型隐式转换为Number然后比较vara={value:0,valueOf:function(){这个。价值++;返回这个值;}};//注意这里的a可以等于1,2,3console.log(a==1&&a==2&&a==3);//truefrule对象隐式转换//注意:但是执行3次后,重新执行a==3还是前面的数为false,因为已经加了值,这里需要注意隐式类型+的转换常规的“+”运算符不仅可以用于数字相加,还可以用于字符串连接。只有当‘+’号两边都是数字时,才进行加法运算;如果两边都是字符串,则直接拼接,不进行隐式类型转换。除了上面描述的更一般的情况外,还有一些特殊的规则,如下所示。如果其中一个为字符串,另一个为undefined、null或Boolean,则调用toString()方法进行字符串拼接;如果是纯对象、数组、正则表达式等,默认调用对象的转换方法会优先(下一讲会具体介绍),再进行拼接。如果其中一个为数字,另一个为undefined、null、Boolean或number,则会转为数字进行加法运算。对象参照前面的规则。如果其中一个是字符串,另一个是数字,则按照字符串规则进行拼接。下面我们结合代码来理解上面的规则,如下图。1+2//3generalcase'1'+'2'//'12'normalcase//我们来看特例'1'+undefined//"1undefined"规则1,undefined转换字符串'1'+null//"1null"rule1,null转string'1'+true//"1true"rule1,true转string'1'+1n//'11'比较特殊字符串,加上BigInt,BigInt转string1+undefined//NaN规则2,未定义的转换数相加NaN1+null//1规则2,null转换为01+true//2规则2,true转换为1,两者相加is21+1n//错误不能直接混加BigInt和Number类型'1'+3//'13'规则3,字符串拼接answer'123'==123//falseortrue?true''==null//是假还是真?false''==0//是假还是真?真[]==0//假还是真?true[]==''//是假还是真?真[]==![]//假还是真?truenull==undefined//是假还是真?trueNumber(null)//返回什么?0Number('')//返回什么?0parseInt('');//返回什么?NaN{}+10//返回什么?10让对象={[Symbol.toPrimitive](){返回200;},valueOf(){返回300;},toString(){返回'你好';}}console.log(obj+200);//这里打印的是什么?400本文由博客多发平台OpenWrite发表!