js隐式转换

js隐式转换

js基础数据类型:stringnumberbooleannullundefinedsymbol

当运算符在运算时,如果运算符两边的数据类型不一致,那么CPU就无法进行计算。js的编辑器会自动将运算符两边的数据转换为同一类型,从而让计算机识别并可以进行计算,这一转换过程由编译器自动自行,不需要程序员手动操作,所以称之为隐式转换

隐式转换规则

  1. 字符串转换:字符串 + 变量;所有与字符串相加的基础变量都将转换为字符串。

    例如:

    “”+变量 //将变量转换为字符串

  2. number转换:自增运算符(++,--),或者算术运算符(+,-,*,/,%),或者关系运算符(>,<,>=,<=,==,!=,===,!==) 变量

    例如:

    +value //将value转换为number类型

    value-“1” //会分别将value和1转换为number,再进行计算

  3. boolean转换:!变量

    例如:

    !value //将value转换为boolean类型

    !!value //先将value转化为blooean,然后将value取反

  4. undefined == null,但是undefined !== null

  5. NaN不等于任何值,包括它自身

  6. 在进行数字计算时,boolean的true=1,false=0

  7. 引用类型不能用 ==做比较,因为栈中存在的仅仅是引用地址

    []==[] //false

    {}=={}//false

    var a ={a:1},b={a:1}; cosole.log(a==b); //false

  8. 对象与基础类型比较,会优先将对象转换为字符串再进行基础类型比较。

    [] == 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]";

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值