1.定义隐式转换是指在JavaScript中,运算符在运算时,如果两边的数据不统一,CPU就无法计算。这时候我们的编译器会自动将转换运算符两侧的数据做一次数据类型转换,转换成相同的数据类型再进行计算。这种由编译器自动转换而无需程序员手动转换的方法称为隐式转换。2.转换规则JavaScript类型分为基本数据类型和引用数据类型:基本数据类型:Undefined,Null,String,Number,Boolean,(Symbol)->ES6引用类型:Object直接转换规则如下:和当使用运算符时,两边不同数据类型的自动转换都有自己的一套默认规则,在权威的JavaScript指南中有解释:根据上面的解释,归类为以下规则:转换为String类型:字符串连接:+例子:String(1)+"10"="1"+"10"="110"注:只要加号的一侧是字符串,就是字符串运算符。转换为数字类型:自增自减运算符:++/--算术运算符:+-*/%关系运算符:><>=<===!====!==转换为布尔类型:逻辑非运算符:!转boolean类型变为false:undefined,null,空字符串,0,-0,NaNnewNumber()和Number()不同,newNumber()创建一个Number对象,Number()将传入的参数转换成数字字面量并给出更多例子:1+"true"//"1true"如果+两边都有一个字符串,则将另一个转换为字符串进行字符串拼接String(1)+"true"="1true"1+true//2其中+是算术运算符1+Number(true)=1+1=21+undefined//NaN其中+是算术运算符1+Number(undefined)=1+NaN=NaN1+null//1其中+是算术运算符1+Number(null)=1+0=11+"10"//"110"其中+是字符串连接String(1)+"10"="1"+"10"="110"1-"10"//-9其中+是算术运算符1-Number("10")=1-9=-9//不要将字符串连接与算术运算符隐式转换规则混淆"2">10//falseNumber(2)>10=2>10=false"2">"10"//当两边都为stri时为真ngs,将它们转换为数字并比较关系。请注意,这不是以Number()的形式转为数字,但根据字符串对应的unicode编码转为数字,charCodeAt(index)index为字符下标,默认为0"2".charCodeAt(0)>'10'.charCodeAt(0)=50>49=true"abc">"b"//false比较'a'.charCodeAt(0)=97'b'.charCodeAt(0)=98"abc">"aad"//trueNaN==NaN//false特殊情况:如果数据类型为undefined或null,固定结果undefined==undefined//trueundefined==null//truenull==null//trueNaN==NaN//false3.对象类型转换//对象转换为布尔值始终为真//对象vara={b:1}a.toString()?"[objectObject]"a.valueOf()?{b:1}//数组vara=[1,2,3]a.toString()?"1,2,3"a.valueOf()?[1,2,3]//functionvara=function(){b=333;返回111;}a.toString()?"function(){b=333;return111;}"a.valueOf()??(){b=333;返回111;}//Datevara=newDate()a.toString()?"ThuMar07201913:48:31GMT+0800(ChinaStandardTime)"a.valueOf()?1551937711874//errorErrortoString()返回:"Error{errordescription}"valueOf()returns:erroritself//正则表达式vara=newRegExp('^ass[^f]\w?','gi')a.toString()?"/^Ass[^f]\w?/gi"a.valueOf()?"/^ass[^f]\w?/gi"四、总结与实践1、算术运算符(+、-、*、/、++,–,%...)'+'作为双目运算符:如果+两边都有一个字符串,那么另一边也会转为字符串进行字符串拼接。其他情况,不管双目还是单向转换为数值类型2.关系运算符(>、<、==、!=...)===、!==:同时比较类型和值,如果都为真则返回真==、!==:如果两边都是对象,比较它们的引用,看它们是否相同!(逻辑非):将后面的变量或表达式转换为布尔值比较字符串:从头扫描到尾,比较的unicode编码每个字符一个接一个,直到大小分开。其他情况下,两边都转为数值类型。NaN不同于任何值,与任何值比较都返回false。对对象类型进行类型转换时,调用valueOf()方法od首先,然后在执行对象字面量时尝试使用toString()方法。计算数量时要注意(这里是JSON格式的对象字面量)。如果运算符两边都是字面量,则作为对象字面量进行类型转换;如果只有一个字面量,要注意。当它首先出现时,这个文字被视为一个块。{}+{}=>"[objectObject][objectObject]"{}视为一个块,相当于执行({},+[]),计算的结果是+[]{}+[]=>等价于{};+[],也就是执行前面的代码,只剩下+[]=>+""=>0{a:1}+[]=>0{}==[]=>Error({},==[])=>错误变量形式运算正常vara={q:1}a+[]=>"[objectObject]"[]+a=>"[objectObject]"[]1,2,3]+[]=>"1,2,3"+""=>"1,2,3"[]+{}=>""+"[objectObject]"=>"[objectObject]"[]==0//true[]=>""=>0![]==0//true![]=>false=>0[]==![]//true[]=>""=>0![]=>false=>0[]==[]//false比较参考地址{}=={}//false比较参考地址{}==!{}//false!{}=>false=>0{}=>"[objectObject]"=>Number("[objectObject]")=>NaN
