数据转换
字符与数字转换
-
Number()能用于任何数据类型转换成数字
如果是null、false返回0,如果是包含了非数字字符、undefined返回NaN
-
parseInt()和parseFloat(),分别能够返回第一个解析到的整数/包含小数
在数字后面接上其他非数字字符不影响结果,但如果先解析字符则返回NaN
-
双波浪符
~~
能够把字符转换为数字,如果字符包含非数字则返回0
在四舍五入的情况下,保留小数:toFixed(num)
,参数为保留的小数。
- 四舍五入:
Math.round(x)
- 向上取整:
Math.ceil(x)
- 向下取整:
Math.floor(x)
- 0~1的随机数(含0不含1):
Math.random()
- 返回指定范围随机数[n,m]之间的范围的公式为:
Math.floor(Math.random() * (max - min + 1)) + min
判断整数:
num%1 === 0
任何整数都会被1整除,余数是0。但比较之前应该判断一下类型- 对数字进行四舍五入或者上下取整
Math.ceil(num)===num
- 利用十进制转化特点,
parseInt(num,10) === num
- ES6的
Number.isInteger(num)
隐式转换
- 如果数字与字符相加+,会转换为字符。
- 如果数字与字符相减-,会转换为数字。
var a = '1';
a += 1;//这样的情况往往是a会变成字符串11
//最简单的写法是使用隐式转换
a -= (-1)//减去一个负数
- NaN和任何变量运算结果为NaN
- 对象的运算会先转换valueOf,再toString()
==
与===
和Object.is()区别
==的判断规则:如果两个值类型不同,会进行转换再比较。(数字优先,字符其次)
- null和undefined相等
- 如果是字符串和数值比较,要全部换成数值再比较
- 如果任一值是true,转化成1,任一值是false,转化成0 (也是转换数值)
- 如果是对象和数字或者字符串比较,对象转换为基础类型的值再比较(利用
toString
和valueOf
) - NaN不相等于NaN,也不合任何数字相等(NaN属于数值,是特殊的数值)
===的判断规则:
- 类型不同就不相等
- NaN不相等于NaN,也不合任何数字相等(NaN属于数值,是特殊的数值)
Object.is与===区别只有:
- +0和-0不相等
- NaN等于自身(因此可以用来判断一个数字是否是NaN)
一些容易搞错的变量转换
原始值 | 转为数字 | 转为字符串 | 转为布尔值 |
---|---|---|---|
Infinity | Infinity | “Infinity” | true |
-Infinity | -Infinity | “-Infinity” | true |
[] | 0 | “” | true |
[10,20] | NaN | “10,20” | true |
function{} | NaN | “function(){}” | true |
{} | NaN | “[object Object]” | true |
- 字符串只有为""的时候才会转换为false,其他均为true
console.log([]+[]);// ''
console.log([]+![]);//false
console.log([] == ![]);// true
// ![]先转false,false在==中会转换为0
// []在==中会转换为"",""会转换为0
console.log([]==[]);//false
对象转换原始类型
- 如果有
Symbol.toPrimitive()
方法,优先调用再返回 - 调用
valulOf()
,如果转换为原始类型则返回 - 调用
toString()
,如果转换为原始类型则返回 - 以上均没有的时候:
- 转布尔值=>null为false,其他为true
- 转数字=>NaN
- 转字符串=> “[object Object]”
数组转换原始类型
- 转成布尔值=>永远是true
- 转成字符串=>去掉中括号
- 转成数值=>先转成字符串,在转成数值类型(所以有逗号的会变成NaN)