JS(隐式转换)

一、什么时候会隐式转换如何转化的,会转换成什么?

在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算.这种无需程序员手动转换,而由编译器自动转换的方式就称为隐式转换

  • 1.1、数字运算:把数字字符转换成数字
  • 1.11转成number类型:++/–(自增自减运算符) + - * / %(算术运算符) > < >= < = == != === !=== (关系运算符)
    数据转换

对象-------字符串------数值----布尔任意两种类型比较时,如果不是同一个类型比较的话,则按如图方式进行相应类型转换,如对象和布尔比较的话,对象 => 字符串 => 数值 布尔值 => 数值

1 > "0"这行代码在js中并不会报错,编译器在运算符时会先把右边的"0"转成数字0`然后在比较大小
alert('9'-10);//-1
console.log('8'>19);//false
 alert('20'>9);//true
alert('2'>'9');//false
alert('a'<'c');//true
alert('d'<'ab');//false--'d'.charCodeAt()--100
'ab'charCodeAt(0)---97
console.log('10'>'9');//true
alert(NaN==NaN);//false非数字有不同的
alert(undefined==null);//true
alert(undefined==undefined);//true

分析:把两边都转换成数字类型再进行比较,都是字符串的时候是转换成ASCII码:方法字符/字符串.charCodeAt(字符下标,默认为0),若是字符和字符串比较是对应一个字符一个字符比较

  • 1.12转换成string**-**
alert('9'+10);//910且此时910是字符串--->转成string类型
alert(typeof('9'+10));//string
  • 2、[]
alert([]==10);//false
//注意[]----true
alert([]==0);//true 
//原理:[].valueOf().toString()==>空字符串==0
alert(![]==0);//true
//原理:![]==>false==>0
alert([]==[]);//false
//原理:引用类型数组存放在堆中,栈中存储的是地址,所以他们结果是false
var boo = new Boolean(false)
document.write(boo.valueOf())//判断bool的值
//false
alert([]==![]);//true
alert({}==!{});//false
//原理:{}.valueOf().toString()==>字符串[object Object]  !{}=false  Number([object Object])==Number(false)
alert({}=={});//false
//原理:引用类型数组存放在堆中,栈中存储的是地址,所以他们结果是false
  • 3、转成boolean(1/0))
alert(1+true);//2
alert(1+'true');//1true
alert(10+undefined);//NaN
alert(10+null);//10

分析:+两边只要有一个是字符的时候它的作用为连接会把其他数据类型调用String()方法连接成字符串,数字的话才是数学的加法它是将其他类型调用Number()方法转换为数字

  • 复杂数据类型在隐式转换时会先转成string,然后再转成Number运算

  • 复杂数据类型number顺序:先使用valueOf方法获取其原始值,如果原始值不是number类型,则使用toString()方法转换成string最后转换成number运算

console.log([8,9].valueOf());
console.log({}.valueOf());
console.log([8,9].valueOf().toString());//8,9
console.log({}.valueOf().toString());
console.log({}.valueOf().toString());//[object Object]
console.log([8,9]=='8,9');//true
console.log({}=='[object,object]');//true
var a={
    i:0,//声明一个属性i
    valueOf:function(){
        return++a.i;//每调用依次,让对象a的i属性自增依次并返回
    }
}
if(a==1&&a==2&&a==3)//每依次运算时都会电工用依次a的valueOf()方法
{
    console.log('1');
}//结果打印1
  • 逻辑非隐式转换与关系运算符隐式转换

  • 空数组的toString()方法得到的空字符串,而空对象的tostring()方法会得到[object,Object](注意第一个小写o,第二个大写O哟)

  • 1、对象到字符串的转换( 这里说的是String()方法的原理 )
    若具有toString()方法,调用toString(),如果它返回一个原始值,将这个原始值转换为字符串返回
    若无toString()方法,或toString()的返回值并不是一个原始值,寻找其valueOf()方法,若存在这个方法,调用它,如果它返回一个原始值,将这个原始值转换为字符串返回
    否则(无valueOf()或valueOf()的返回值不是原始值),JS无法从toString()或valueOf()方法获得一个原始值,因此,throw TypeError
    2、对象到数字的转换(这里说的是Number()方法的原理)
    若具有valueOf()方法,调用valueOf(),如果它返回一个原始值,将这个原始值转换为数字返回
    若无valueOf()方法,或valueOf()的返回值并不是一个原始值,寻找其toString()方法,若存在这个方法,调用它,如果它返回一个原始值,将这个原始值转换为数字返回
    否则(无toString()或toString()的返回值不是原始值),JS无法从toString()或valueOf()方法获得一个原始值,因此,throw TypeError
    对象到数字的转换和对象到字符串的转换类似,只是两个方法的调用顺序不同

https://blog.csdn.net/qq_33120763/article/details/88296955
https://blog.csdn.net/itcast_cn/article/details/82887895

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值