valueOf 和 toString
基本类型的valueof返回自身的原始类型,Array,Object,Function返回自身。Date返回对应的时间戳。
toString:
{age:1} | function(){} | [1,2,3] | [{age:1}] | new Date() | “asfd” | 123 | false | |
---|---|---|---|---|---|---|---|---|
valueOf | {age: 1} | ƒ (){} | [1, 2, 3] | {age:1} | 1573028564904 | “asfd” | 123 | false |
toString | “[object Object]” | “function(){}” | “1,2,3” | “[object Object]” | “Wed Nov 06 2019 16:22:44 GMT+0800 (中国标准时间)” | “asfd” | ‘123’ | ‘false’ |
null和undefined没有构造函数,所以不能调用toString和valueOf方法。
1.ToPrimitive(input , preferedType)
JavaScript 调用 @@toPrimitive 方法将一个对象转换为原始值表示。你不需要自己调用 @@toPrimitive 方法;当对象需要被转换为原始值时,JavaScript 会自动地调用该方法。
input是需要转换的值;
preferedType是要转换的类型;
执行过程:
1.input是基本类型,直接返回input;
2.调用input.valueOf(),结果如果是基本类型,直接返回这个结果 ;
3.调用input.toString(),结果如果是基本类型,直接返回这个结果;
4.抛出typeError的错误;
注意:
1.preferedType只会传入Number或者String,不传默认是Number;
2.当input是date时,preferedType是String;
3.preferedType为String时,先执行valueOf后执行toString;
2.ToBoolean(argument)
除了undefined,null,false,NaN,’’,0,-0,其他所有值都转为true。
3.ToNunber(argument)
转换后 | |
---|---|
Undefined | NaN |
Null | +0 |
Boolean | true=>1 , false=> 0 |
Number | 本身 |
String | 将字符串转为数字,‘23’=>23,‘12a’=>NaN |
Object | 先primValue=toPrimitive(argument,Number),再对primValue使用ToNumber(primvalue) |
4.ToString(argument)
转换后 | |
---|---|
Undefined | ‘undefined’ |
Null | ‘null’ |
Boolean | true=>‘true’ , false=> ‘false’ |
Number | ‘本身’ |
String | 本身 |
Object | 先primValue=toPrimitive(argument,String),再对primValue使用ToString(primvalue) |
隐式类型转换
加法
1.令lval = 符号左边的值,rval = 符号右边的值
2.令lprim = ToPrimitive(lval),rprim = ToPrimitive(rval)
3.lprim 或者 rprim 有一个是String类型的,就调用ToString把 lprim 和 rprim 拼接起来返回即可
4.否则,将ToNumber(lprim) 和 ToNumber(rprim) 做加法运算
容易混淆的点是,做加法和toNumber的区别。加法是先ToPrimitive,返回值是String类型就toString拼接;toNumber会先ToPrimitive后toNumber;
例如:
[]+[] 是加法运算,先ToPrimitive都返回“”,至少有一个是字符串,两个拼接;
{}+[] 大括号开头认为是代码段,+[] 调用Number([]),先ToPrimitive([])返回‘’,后toNumber为0;
[]+{} 加法,先 ToPrimitive([]) =>’’,ToPrimitive({})=>’[Object,Object]’,字符串拼接;
双等
arg1 == arg2
1.当arg1和arg2都是null,或者都是undefined时,为true;一方为undefined、NaN、null,return false;
2.如果x和y为String、Number、Boolean并且类型不一致,都转为Number再进行比较;
3.如果存在Object,转换为原始值再进行比较;
减法 乘法 除法
转换为数字然后操作
重点题目:
5*‘5’ | ‘5’转为数字5,得25 |
---|---|
Null/5 | 除法转为数字,null转数字为0,得0 |
5*[1,2] | [1,2]转数字,先调用ToPrimitive([1,2])为‘1,2’,再调toNumber,得NaN |
[]+[] | 加法操作,先调用ToPrimitive([]),返回‘’,是String类型,做拼接返回 |
5>=NaN | false |
5*‘a’ | |
5/NaN | |
[]+{} | |
0/0 | |
5*[] | |
5<[1,2] | |
5/‘a’ | |
5>=null | |
5/[1] | |
‘a’++‘b’ | |
5/undefined | |
5*‘false’ | |
5+[1,2,3] | |
5>=true | |
{}+[] | |
5/[] | |
5*true | |
({})+[] | |
5*null | |
5>=‘true’ | |
5>[] | |
123+{toString:function(){return ‘def’}} | |
5/null | |
‘16’>‘5’ | |
0>[1] | |
123+{toString:function(){return ‘def’},valueOf:function(){return 3}} |