JS系列第二弹:JS基础之类型转换

一、JS中的转换规则

1、各种数据类型的数字转换
0- 空列表 ==0, 只有一个有效数字则为有效数字, 否则为NaN
1- 字符转换为数字: 空字符串转为0, 如果出现的是任何非有效数字字符, 结果都是NAN
2- 布尔值转换为数字: true ==1, false==0
3- null ==0
4- undefined ==》 NaN
5- Symbol无法转换为数字, 报错。
6- BigInt去除‘n’(超过安全数字的, 会按照科学计数法处理)
7- 把对象转换为数字: 按照下列顺序优先级: Symbol.toPrimitive > valueOf的原始值 > toString【普通对象valueOf返回它本身, 就是引用类型, 没有原始值】
8- 日期对象则返回一个数字类型的毫秒数, 在此不做讨论
9- 函数可视为对象, 后续详细讲解

0- 空列表 ==》 0, 只有一个有效数字则为有效数字, 否则为NaN
在这里插入图片描述

1- 字符转换为数字: 空字符串转为0, 如果出现的是任何非有效数字字符, 结果都是NAN
在这里插入图片描述

2- 布尔值转换为数字: true =》 1, false=》0
在这里插入图片描述

3- null ==》 0
在这里插入图片描述

4- undefined ==》 NaN
在这里插入图片描述

5- Symbol无法转换为数字, 报错。
在这里插入图片描述

6- BigInt去除‘n’(超过安全数字的, 会按照科学计数法处理)
在这里插入图片描述

7- 把对象转换为数字: 按照下列顺序优先级: Symbol.toPrimitive > valueOf的原始值 > toString【普通对象valueOf返回它本身, 就是引用类型, 没有原始值】日期对象则返回一个数字类型的毫秒数, 在此不做讨论
在这里插入图片描述

2、强转为数字
parseInt([val], [radix]) 其中:  
[val]为值。 
[radix]为进制。
如果不写, 或者写0. 默认是10进制,【如果是字符串则以'0x'开头,默认是16进制】
有效范围在2-36之间【超过这个范围则返回NaN】

1- [val]值必须是一个字符串, 如果不是先隐士转换为字符串【通过string(val)转换】
2- 然后从字符串左侧的第一个字符开始寻找, 查找出符合[radix]禁止的值, 如遇到不符合的字符则停止查找
3- 把找到的内容按照[radix]进制转为10进制的数字,异常则返回NaN
4- 遇到非有效数字字符, 不论后面是否有效数字字符, 都停止查找 
3、强转为字符串
String([val])
再绝大多数情况下, 字符串底层使用的时候会调用[val]的toString方法。但是针对null/undefined等String()方法会有特殊的处理。 可以视为一种安全的字符串转换方案。
当然, 我们可以通过重写某一变量的toString()方法, 使String方法变成我们自己想实现的功能。
String(val)的结果除了是字符串外, 也可以是别的类型。 
val.toString的结果只能是字符串。

1- 若val是一个原始值, 则转换结果直接为字符串即可
2- 若val是一个对象, 转换规则如下
	a,先调用对象的Symbol.toPrimtive方法
	b,如果没有以上属性, 则调用对象的valueOf方法
	c,如果没有以上属性,则调用对象的toString方法

部分情况下, String() 和 toString() 效果是一致的。但是String()更安全一点
在这里插入图片描述

4、强转为布尔值
除了0, 空字符串, NaN, undefined,false之外, 全部返回 true
5、强转为Symbol
Symbol作为ES10新增的一个数据类型, 每个Symbol()返回的值都是唯一的。 一个symbol值作为对象属性的标识符, 这是数据类型仅有的目的。可以用来标识对象的唯一属性。

在这里插入图片描述

6、计算符(+,-,*,/)隐式转换
-, *, /, %
将二者隐式转换为Number

1- (-, *, /, %)将二者隐式转换为Number
在这里插入图片描述
对于对象完全遵循规则Number强转的规则, Symbol.toPrimitive > valueOf的原始值 > toString

这里着重强调一个加号: +
var b = {}
console.log(+b)
+b的情况相当于转为数字, 即Number(b)
如果+两边都为数字, 则为数字计算, 如果+两侧有一个为字符串, 则转为字符串拼接。只要有一方不为数字, 则作为字符串拼接。

在这里插入图片描述

7、==隐式转换
当使用==进行判断的时候, 会出现比较复杂的情况
1- 两边类型如果相同, 值相等则相等,Symbol类型除外。
2- 比较的双方都为基本数据类型
	a, 若是一方为null, undefined,则另一方必须为null或者undefined,结果才会true, 
	也就是null==undefined为true或者null==null为true, 因为undefined派生于null。
	b,其中一方为String, 则把String转为Number再比较
	c,其中一方为Boolean, 则将Boolean转为Number再来比较
3- 比较的一方有引用类型
	a, 如果其中一方为Object, 且另一方为String, Number或者Symbol, 回见Object转换成字符串, 再进行比较。
	b,两方都为引用类型, 则判断它们是不是指向同一个对象。

1- 两边类型如果相同, 值相等则相等,Symbol类型除外。
在这里插入图片描述

2- 若是一方为null, undefined,则另一方必须为null或者undefined,结果才会true,
也就是nullundefined为true或者nullnull为true, 因为undefined派生于null。
在这里插入图片描述

3- 其中一方为String, 则把String转为Number再比较。其中一方为Boolean, 则将Boolean转为Number再来比较
在这里插入图片描述

4- 比较的一方有引用类型.如果其中一方为Object, 且另一方为String, Number或者Symbol, 回见Object转换成字符串, 再进行比较。
在这里插入图片描述

5- 两方都为引用类型, 则判断它们是不是指向同一个对象。
在这里插入图片描述

二、练习题

练习题
1- 计算 !+[]  的返回值
2- 用 !+[] 四个字符生成5
3- 用 !+[] 四个字符生成‘554- 用 !+[] 四个字符生成‘res’

!为取反的符号,所以先计算+[]
+后面接一个对象,等价于Number([]).值为0
!0, 即为true

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值