JS 是弱类型语言,运算时会偷偷自动转换类型,这就是隐式转换。
核心三种:
① + 运算——字符串拼接优先,数字 + 字符串变字符串
② - * /——都转数字再算
③ ==——会自动转类型再比较(=== 不会)
坑:"1" == 1 为 true 但 "1" === 1 为 false、null == undefined 为 true、空数组转字符串变空串。
把一个东西扔进 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');
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.30000000000000004(一长串尾巴) console.log(0.1 + 0.2); // false console.log(0.1 + 0.2 === 0.3);
如果你拿 JS 小数直接算钱,就会出现 0.1+0.2 多出一截尾巴,因为电脑用二进制存小数,有些十进制小数存不精确。这不是代码错,是浮点天生的。所以算钱要么乘 100 变整数(用分算),要么用专门的库,别硬算。
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() 转干净再算。
| API | 作用 | 参数 | 返回值 | 代码示例 |
|---|---|---|---|---|
| Number() | 隐式/显式把值转数字 | 任意值 | 数字 / NaN | console.log(Number("3.14")); |
| Boolean() | 把值转成 真/假 | 任意值 | true / false | console.log(Boolean(0)); // false |
| isNaN() | 判断是不是 NaN(不是数) | 任意值 | true / false | console.log(isNaN("abc")); // true |
| === | 严格相等(类型也得一样) | 两个值 | true / false | console.log(5 === "5"); // false |