js中的隐含类型转换

记录下平时的知识点、心得等,如果理解有误还请提出以便及时修正...

1、ToPrimitive(obj, type):

    js内部存在ToPrimitive(obj, type)隐含转换方法,实质意义上是调用obj对象的valueOf方法及toString方法将该对象转换为原始类型,
其中,Date类型数据默认type为 string(toString),其他对象类型为 number(valueOf),如果两种方法均未能得出一个原始类型数据,则抛出error;
复制代码

2、if中的类型转换:

1) boolean类型:无需转换
2) string类型:""为false,其他为true
3) number类型:0为false,其他为true
4) object类型:null为false,其他为true
5) function类型:为true
6) undefined、NaN:为false
复制代码

3、String()、Number()、Boolean()方法:

1) String方法:对象期望类型为string,先调用toString方法,若结果不是基本类型再调用valueOf方法进行判断;
2) Number方法:对象期望类型为number,先调用valueOf方法,若结果不是基本类型再调用toString方法进行判断;
3) Boolean方法:""、0、null、undefined、NaN默认为false,其他为true;
复制代码

4、+-*÷时的类型转换:

1) js内置对象及function等object中,不同object调用valueOf及toString方法得到的结果各有不同,如下:
    valueOf:
        undefined ---> NaN
        null ---> +0
        boolean ---> 1/0
        string ---> parseInt、parseFloat解析
        object ---> 调用自身valueOf、toString方法
    
    toString:
        undefined ---> "undefined"
        null ---> "null"
        boolean ---> "true"/"false"
        number ---> "(number自身)"
        object ---> 调用自身toString、valueOf方法
        
2) 计算时,遵循以下规则:
    1. 若存在某一对象为string类型,则将其他对象均转为string(通过调用valueOf ---> toString);
    2. 对象均为object类型,则使用ToPrimitive方法将其转换为原始类型;
    3. 均转为number类型;

3) 部分知识点:
    1. array.valueOf、object.valueOf ---> 默认情况下返回自身;
    2. +、-跟任何对象表示将该对象转为number类型,object类型仍然是通过ToPrimitive方法进行;
    3. parseInt(str, radix)方法:
        (1) 接收一个string(待解析)参数,一个number(进制2-36,默认10);
        (2) 当str类型不为string类型时,则使用ToPrimitive方法将其转换为原始类型(toString ---> valueOf);
        (3) 若str以"0x"开头,则忽略radix参数,默认使用16进制;
        (4) 若radix超出范围,则忽略radix参数,使用默认进制;
复制代码

5、==时的类型转换:

1) 存在number类型,则将其他类型均转为number类型再进行比较;
2) 存在boolean类型,则将boolean类型转为number类型再进行比较;
3) null == undefined;
4) 存在基本类型 (string) 及object类型,则将object对象应用ToPrimitive方法后再进行比较;
5) 特殊情况:"" == [null]、"" == [undefined],这里null及undefined作为empty值进行处理;
复制代码

6、><时的类型转换:

1) 存在string类型,则将其他类型均转为string类型再进行比较;
2) 均转为number类型再进行比较;
3) >=、<=时,第4及第3种情况均会进行判断,所以出现了[] >=/<= [],{} >=/<= {}
复制代码

7、坑点:

1) [] + {} = "[object Object]"
   {} + [] = 0
   其中,[].toString() = "",{}.toString() = "[object Object]",而第二行 {} 浏览器会将其默认作为代码块进行执行而非一个变量;
   
2) [] == ![]
   其中,!操作符优先级高于==,因此先执行!操作,![] === false,进而比较[] == false;复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值