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

js中的比较运算符隐式类型转换

时间:2023-04-04 22:49:36 HTML5

前言相信你在代码中经常看到'=='和'===',但是你真的了解比较运算符和其中的隐式转换吗?今天让我们重新认识一下比较运算符。全等运算符===说明:严格匹配,不进行类型转换,数据类型必须与值完全一致,首先要判断类型。如果不是同一类型,则直接为false;1对于基本数据类型(值类型):Number、String、Boolean、Null和Undefined:两边的值必须一致才相等console.log(null===null)//trueconsole.log(undefined===undefined)//true注意:NaN:不会等于任何数字,包括它本身console.log(NaN===NaN)//false2对于复杂数据类型(引用类型):Object,Array,函数等:如果两边的引用地址一致,则相等arr1=[1,2,3];arr2=arr1;console.log(arr1===arr2)//true相等运算符==非严格匹配:会有类型转换,但是有五个条件(以下代码以x==y为例)x和y都是null或者undefined:规则:没有隐式类型转换,无条件返回trueconsole.log(null==undefined);//trueconsole.log(null==null);//trueconsole.log(undefined==undefined);//truexoryisNaN:NaN不等于任何数Rule:没有隐式类型转换,无条件返回falseconsole.log(NaN==NaN);//falsexandyarebothstring,boolean,number规则:存在隐式类型转换,会将非number类型的数据转换为numberconsole.log(1==true);//true(1)1==Number(true)console.log(1=="true");//false(1)1==麻木er('true')console.log(1==!"true");//false(1)1==!Boolean('true')(2)1==!true(3)1==false(4)1==Number(false)console.log(0==!"true");//trueconsole.log(true=='true')//falseoryisacomplexdatatype:复杂数据type会先获取数据类型的原始值后,比较复杂数据类型的原始值:先调用valueOf方法,再调用toString方法valueOf:一般默认返回自身数组的toString:默认调用join方法拼接每个元素,返回拼接后的字符串console.log([].toString());//空字符串console.log({}.toString());//[objectObject]注意:空数组的toString()方法会得到一个空字符串,空对象的toString()方法会得到字符串[objectObject](注意第一个小写o,第二个大写O)console.log([1,2,3].valueOf().toString());//'1,2,3'console.log([1,2,3]=="1,2,3");//true(1)[1,2,3].toString()=='1,2,3'(2)'1,2,3'=='1,2,3'控制台。log({}=='[objectObject]');//truex和y都是复杂数据类型:规则只比较地址,地址匹配则返回true,否则返回falsevararr1=[10,20,30];vararr2=[10,20,30];vararr3=arr1;//将arr1的地址复制到arr3console.log(arr1==arr2);//虽然arr1和arr2中的数据相同,但它们有两个不同的地址console.log(arr3==arr1);//true两者地址相同console.log([]==[]);//falseconsole.log({}=={});//false经典面试题注:八种情况转boolean得到false:0-0NaNundefinednull''falsedocument.all()console.log([]==0);//true//分析:(1)[].valueOf().toString()==0(2)Number('')==0(3)false==0(4)0==0console.log(![]==0);//true//分析:逻辑非优先级高于关系运算符![]=false(空数组转换boolean值得到true)console.log([]==[]);//false//[]与右边的逻辑非表达式结果比较//(1)[]==!Boolean([])(2)[]==!true(3)[]==false(4)[].toString()==false(5)''==false(6)Number('0')==Number(false)console.log([]==![]);//trueonsole.log({}=={});//false//{}与右边的逻辑非表达式结果比较//(1){}==!{}(2){}==!true(3){}==false(4){}.toString()==false(5)'[objectObject]'==false(6)Number('[objectObject]')==falseconsole.log({}==!{});//假异常面试题vara=???if(a==1&&a==2&&a==3){console.log(1)}//如何完善a才能正确打印1//回答vara={i:0,//声明一个属性ivalueOf:function(){return++a.i;//每次调用,让对象a的i属性自增一次并返回}}if(a==1&&a==2&&a==3){//每次操作都会调用一次a的valueOf()方法console.log("1");}