记录下平时的知识点、心得等,如果理解有误还请提出以便及时修正...
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;复制代码