JavaScript中比较运算符隐式类型转换的案例

  介绍

小编给大家分享一下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中比较运算符隐式类型转换的案例