一、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- 用 !+[] 四个字符生成‘55’
4- 用 !+[] 四个字符生成‘res’
!为取反的符号,所以先计算+[]
+后面接一个对象,等价于Number([]).值为0
!0, 即为true