← 返回目录

6. 隐式转换与精度坑

JS 是弱类型语言,运算时会偷偷自动转换类型,这就是隐式转换。

核心三种:
+ 运算——字符串拼接优先,数字 + 字符串变字符串
- * /——都转数字再算
==——会自动转类型再比较(=== 不会)

坑:"1" == 1 为 true 但 "1" === 1 为 false、null == undefined 为 true、空数组转字符串变空串

6.1 互动演示

先在心里猜结果,再点按钮。

6.2 知识点逐条讲解(配合代码)

① 哪些东西"算假"?六个假值

把一个东西扔进 Boolean() 里,它会告诉你这个东西"真还是假"。整个 JS 里只有 6 个东西会被判成"假",其他全是"真"。连字符串 "false" 都是真的(因为里面有字)!

被判成 false 的值人话
''(空字符串)一张白纸,没写字
0数字 0
NaN算不出来
null主动放空
undefined忘了放东西
false它自己
// false(空串)
Boolean('');
// false
Boolean(0);
// false
Boolean(NaN);
// false
Boolean(null);
// false
Boolean(undefined);
// true ← 字符串里有字,是真!
Boolean('false');
// true
Boolean('hello');

② 浏览器偷偷帮你转类型:'5'-2 和 '5'+2

JS 是弱类型,你算的时候它会偷偷把类型变一变。关键看加号 + 两边有没有文字

// 3 减号没文字,浏览器把 '5' 偷偷变成数字 5 再减
'5' - 2;
// "52" 加号一边是文字,就变成"把两段拼起来",2 也变文字
'5' + 2;
// 5 除法同理,'10' 变 10
'10' / 2;
// 20 乘法同理
'10' * 2;

如果你以为 '5' + 2 会等于 7,那就上当了——加号只要碰着文字,就不干加法、改干"拼接",所以出来的是 "52"。记住:'5'-2=3,但 '5'+2="52"

③ 精度坑:0.1 + 0.2 为什么不等于 0.3

// 0.30000000000000004(一长串尾巴)
console.log(0.1 + 0.2);
// false
console.log(0.1 + 0.2 === 0.3);

如果你拿 JS 小数直接算钱,就会出现 0.1+0.2 多出一截尾巴,因为电脑用二进制存小数,有些十进制小数存不精确。这不是代码错,是浮点天生的。所以算钱要么乘 100 变整数(用分算),要么用专门的库,别硬算。

isNaN:问一句"它是不是数字"

NaN = "算不出来"。isNaN() 就是替你问一句"这玩意儿是不是数字?",返回 true 代表"它不是数字"。

// false:123 是数字,所以"不是非数字"
isNaN(123);
// false:'123' 能变数字
isNaN('123');
// true:'abc' 变数字是 NaN,所以"它不是数字"
isNaN('abc');

如果你看到 isNaN(123) 返回 false 觉得它在骗人,别晕:它的名字是"is Not a Number",true = "真的不是数字"。123 是数字,所以它说 false(不是非数字)。名字绕,结果反着记。

实战:用在哪 / 常见坑 / 怎么解决

① 可能在什么地方用:拼提示语展示;简单的加减计算。

② 常见的问题:算钱算出 0.30000004;以为 '5'+2 等于 7,结果得到 '52'。

③ 解决思路:涉及钱就乘 100 用分算;分不清拼接和加法时,先把输入用 Number() 转干净再算。

一句话记住:六个假值 '' 0 NaN null undefined false;'5'-2=3 但 '5'+2="52";0.1+0.2≠0.3;isNaN 返回 true 就表示"这玩意儿不是数字"

本页重点

API作用参数返回值代码示例
Number()隐式/显式把值转数字任意值数字 / NaNconsole.log(Number("3.14"));
Boolean()把值转成 真/假任意值true / falseconsole.log(Boolean(0)); // false
isNaN()判断是不是 NaN(不是数)任意值true / falseconsole.log(isNaN("abc")); // true
===严格相等(类型也得一样)两个值true / falseconsole.log(5 === "5"); // false