JS的类型转换
Posted 努力努力再努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS的类型转换相关的知识,希望对你有一定的参考价值。
首先我们要知道,在 JS 中类型转换只有三种情况,分别是:
- 转换为布尔值
- 转换为数字
- 转换为字符串
我们先来看一个类型转换表格
转Boolean
在条件判断时,除了 undefined
, null
, false
, NaN
, \'\'
, 0
, -0
,其他所有值都转为 true
,包括所有对象。
对象转原始类型
对象在转换类型的时候,会调用内置的 [[ToPrimitive]]
函数,对于该函数来说,算法逻辑一般来说如下:
- 如果已经是原始类型了,那就不需要转换了
- 调用
x.valueOf()
,如果转换为基础类型,就返回转换的值 - 调用
x.toString()
,如果转换为基础类型,就返回转换的值 - 如果都没有返回原始类型,就会报错
当然你也可以重写 Symbol.toPrimitive
,该方法在转原始类型时调用优先级最高。
let a = { valueOf() { return 0 }, toString() { return \'1\' }, [Symbol.toPrimitive]() { return 2 } } 1 + a // => 3
四则运算符
加法运算符不同于其他几个运算符,它有以下几个特点:
- 运算中其中一方为字符串,那么就会把另一方也转换为字符串
- 如果一方不是字符串或者数字,那么会将它转换为数字或者字符串
1 + \'1\' // \'11\' true + true // 2 4 + [1,2,3] // "41,2,3"
- 对于第一行代码来说,触发特点一,所以将数字
1
转换为字符串,得到结果\'11\'
- 对于第二行代码来说,触发特点二,所以将
true
转为数字1
- 对于第三行代码来说,触发特点二,所以将数组通过
toString
转为字符串1,2,3
,得到结果41,2,3
另外对于加法还需要注意这个表达式 \'a\' + + \'b\'
\'a\' + + \'b\' // -> "aNaN"
因为 + \'b\'
等于 NaN
,所以结果为 "aNaN"
,你可能也会在一些代码中看到过 + \'1\'
的形式来快速获取 number
类型, + \' \' => 0 。
那么对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转为数字
4 * \'3\' // 12 4 * [] // 0 4 * [1, 2] // NaN
比较运算符
- 如果是对象,就通过
toPrimitive
转换对象 - 如果是字符串,就通过
unicode
字符索引来比较
let a = { valueOf() { return 0 }, toString() { return \'1\' } } a > -1 // true
在以上代码中,因为 a
是对象,所以会通过 valueOf
转换为原始类型再比较值。
以上是关于JS的类型转换的主要内容,如果未能解决你的问题,请参考以下文章