js基础-类型转换

valueOf 和 toString
基本类型的valueof返回自身的原始类型,Array,Object,Function返回自身。Date返回对应的时间戳。
toString:

{age:1}function(){}[1,2,3][{age:1}]new Date()“asfd”123false
valueOf{age: 1}ƒ (){}[1, 2, 3]{age:1}1573028564904“asfd”123false
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)

转换后
UndefinedNaN
Null+0
Booleantrue=>1 , false=> 0
Number本身
String将字符串转为数字,‘23’=>23,‘12a’=>NaN
Object先primValue=toPrimitive(argument,Number),再对primValue使用ToNumber(primvalue)

4.ToString(argument)

转换后
Undefined‘undefined’
Null‘null’
Booleantrue=>‘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>=NaNfalse
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}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值