介绍
小编给大家分享一下JavaScript中比较运算符隐式类型转换的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
相信大家在代码中经常看见& # 39;==& # 39;和& # 39;===& # 39;,但大家真的弄懂了比较运算符和其中的隐式转换嘛?今天就重新认识下比较运算符。
全等运算符===
说明:严格匹配,不会类型转换,必须要数据类型和值完全一致
先判断类型,如果类型不是同一类型的话直接为假; 1对于基本数据类型(值类型):数字、字符串、布尔值、零和未定义:两边的值要一致,才相等 控制台。日志(null===null)//真实的 控制台。日志(未定义===未定义)//真实的 注意:南:不会等于任何数,包括它自己 控制台。日志(NaN===NaN)//假的 2对于复杂数据类型(引用类型):对象数组,函数等:两边的引用地址如果一致的话,是相等的 arr1=(1、2、3); arr2=arr1; 控制台。日志(arr1===arr2)//真正的
相等运算符==
非严格匹配:会类型转换,但是有前提条件一共有五种情况
(接下来的代码以x==y为示例)
x和y都是零或未定义:
,规则:没有隐式类型转换,无条件返回真正的
控制台。日志(null==定义);//真实的 控制台。日志(null==null);//真实的 控制台。日志(未定义==定义);//真正的
x或y是南:南与任何数字都不等
,规则:没有隐式类型转换,无条件返回假
控制台。日志(NaN==NaN);//假
x和y都是字符串,布尔值、数字
,规则:有隐式类型转换,会将不类是数字型的数据转成数量
控制台。日志(1==true);//真正的(1)1==数量(真正的) 控制台。日志(1==皌rue");//假(1)1==数量(& # 39;真正的# 39;) 控制台。日志(1==!“true");//假(1)1==!布尔(& # 39;真正的# 39;)(2)1==!真正的(3)1====false(4) 1号(假) 控制台。日志(0==!“true");//真实的 控制台。日志(真正的==& # 39;真正的# 39;)//假
x或y是复杂数据类型:会先获取复杂数据类型的原始值之后再左比较
,复杂数据类型的原始值:先调用的方法,然后调用toString方法
,返回对象的值:一般默认返回自身
,数组的toString:默认会调用加入方法拼接每个元素并且返回拼接后的字符串
控制台。日志([]。toString());//空字符串 控制台。日志({}。toString());//(对象对象) 注意:空数组的toString()方法会得到空字符串, 而空对象的toString()方法会得到字符串(对象对象)(注意第一个小写啊,第二个大写o哟) 控制台。日志([1,2,3].valueOf () .toString ());//?、2、3” 控制台。日志([1,2,3]==?、2、3”);//真正的(1)(1、2、3).toString ()==& # 39; 1, 2, 3 & # 39;(2)& # 39;1、2、3 & # 39;==& # 39;1、2、3 & # 39; 控制台。日志({}==& # 39;[对象对象]& # 39;);//真正的
x和y都是复杂数据类型:
,规则只比较地址,如果地址一致则返回真,否则返回假
var arr1=(10年,20年,30); var arr2=(10年,20年,30); var arr3=arr1;//将arr1的地址拷贝给arr3 控制台。日志(arr1==arr2);//虽然arr1与arr2中的数据是一样,但是它们两个不同的地址 控制台。日志(arr3==arr1);//真实两者地址是一样 控制台。日志([]==[]);//假的 控制台。日志({}=={});//假
经典面试题
注意:八种情况转布尔得到错误的:0 0南定义空& # 39;& # 39;假document.all () 控制台。日志([]==0);//正确的//分析:(1)[].valueOf () .toString()==0(2)数量(& # 39;& # 39;)==0(3)错误==0 (4)0==0 console.log (![]==0);//正确的//分析:逻辑非优先级高于关系运算符! []=false(空数组转布尔值得到真实) 控制台。日志([]==[]);//错误//[]与右边逻辑非表达式结果比较//(1)[]==!布尔([])(2)[]==!真(3)[]==假(4)[].toString ()==false (5) & # 39; & # 39;==false(6)号(& # 39;0 & # 39;)==数量(假) 控制台。日志([]==! []);//正确的 onsole。日志({}=={});//错误//{}与右边逻辑非表达式结果比较//(1){}==!{}(2){}==!真(3){}==假(4){}.toString ()==false(5) & # 39;[对象对象]& # 39;==false(6)号(& # 39;[对象对象]& # 39;)==false 控制台。日志({}==! {});//错误
变态面试题
var=? ? ? 如果(==1,,==2,,一个==3){ console.log (1) }//如何完善,使其正确打印1//答案 var={ 我:0,//声明一个属我性 返回对象的值:函数(){ + +我返回;//每调用一次,让对象的我属性自增一次并且返回 } } 如果(==1,,==2,,一个==3){//每一次运算时都会调用一次一个的返回对象的值()方法 控制台。日志(“1“); }JavaScript中比较运算符隐式类型转换的案例