js隐式转换
js基础数据类型:string
、number
、boolean
、null
、undefined
、symbol
当运算符在运算时,如果运算符两边的数据类型不一致,那么CPU就无法进行计算。js的编辑器会自动将运算符两边的数据转换为同一类型,从而让计算机识别并可以进行计算,这一转换过程由编译器自动自行,不需要程序员手动操作,所以称之为隐式转换。
隐式转换规则
- 字符串转换:
字符串 + 变量
;所有与字符串相加的基础变量都将转换为字符串。
例如:
“”+变量 //将变量转换为字符串
- number转换:
自增运算符(++,--),或者算术运算符(+,-,*,/,%),或者关系运算符(>,<,>=,<=,==,!=,===,!==) 变量
例如:
+value //将value转换为number类型
value-“1” //会分别将value和1转换为number,再进行计算
- boolean转换:
!变量
例如:
!value //将value转换为boolean类型
!!value //先将value转化为blooean,然后将value取反
undefined == null
,但是undefined !== null
- NaN不等于任何值,包括它自身
- 在进行数字计算时,boolean的
true=1
,false=0
- 引用类型不能用
==
做比较,因为栈中存在的仅仅是引用地址
[]==[] //false
{}=={}//false
var a ={a:1},b={a:1}; cosole.log(a==b); //false
- 对象与基础类型比较,会优先将对象转换为字符串再进行基础类型比较。
[] == false //true
[] == ![] //true
[1,2,3] == ‘1,2,3’ //true
console.log({a:1}==‘a:1’) //false
示例详解1(基础类型比较)
//首先会将执行Number(undefined)=NaN,然后执行1+NaN
console.log(1+undefined); //NaN
//首先执行Number(null)=0,然后执行1+0
console.log(1+null); //1
//首先执行Number(true)=1,然后执行1+1
console.log(1+true); //2
//与字符串相+时,+不再是数学运算符,而是字符串连接符,所以所有值都是字符串拼接
//首先执行String(1)="1",然后执行"1"+"true"
console.log(1+"true"); //"1true"
//当与数字进行关系比较时,会将其他类型优先转换为数字类型,再比较
//首先执行Number("2")=2,然后执行3>2
console.log(3>"2"); //true
//字符串与字符串的比较并非直接转换为数字,而是比较unicode编码的值
//首先执行2.charCodeAt()=50,10.charCodeAt()=49,然后执行50>49
console.log("2">"10"); //true
//多个字符之间的字符串比较,从左向右,一词对每个字符进行比较,直到出结果为止
/*
首先对左右两边的第一个字符a,进行比较,相等
其次对左右两边的第二个字符b,进行比较,相等
最后比较"c".charCodeAt()>"d".charCodeAt()
*/
console.log("abc">"abd"); //false;
示例详解2 (引用类型比较)
引用类型之间不能直接进行比较,因为他们栈中仅仅存储了引用地址。
引用类型和基础类型比较,则会先将引用类型转换为字符串,再参照基础类型比较规则。
引用类型转换为字符串的方式为:引用变量.valueOf().toString()
- 所有数组隐式转换为字符串时,只需将[]替换为’’
- 所有对象隐式转换为字符串时,其值均为’[object Object]’
valueOf()
:强制转换方法,用于获取引用变量的原始值。同时对象的该方法可以被重写覆盖。
例如:
var b = {
i:0,
valueOf:function(){
return ++b.i;
}
}
每调用一次b对象的valueOf(),其b.i将+1。
//引用类型之间的比较仅仅是引用地址的比较
console.log({}=={}); //false
console.log([]==[]); //false
//引用类型和基础类型的比较
//首先执行[].valueOf()="",其次执行Number("")=0,最后执行0==0
console.log([]==0); //true
//这里!优先级高于==,所以不用进行valueOf().toString()
//首先执行![]=false,其次执行Number(false)=0,最后执行0==0
console.log(![]==0); //true
//同上理
console.log(!{}==0); //true
//首先执行!{}=false,其次{}==false
console.log({}==!{}); //false
//首先转化a.valueOf().toString()="[object Object]",其次Number("[object Object]")=NaN,最后NaN == false
var a = {};
console.log(a == false); //false
需注意:
- [].valueOf()=[]原始对象; [].valueOf().toString()="";
- {}必须实例化之后才具有valueOf()方法,{}.valueOf()={}原始对象,{}.valueOf().toString()="[object Object]";