JavaScript 常见陷阱与易错点解析

作者:函数茶馆时间:2026-10-29 05:07:22浏览:106

本文梳理了 JavaScript 中常见的易错知识点,涵盖 NaN 与 Infinity 的特性、浮点数精度丢失、字符串与数字的隐式转换、parseInt 的解析规则、return 语句的分号自动插入机制以及对象与 null 的类型判断。通过具体代码示例,帮助开发者识别并避免这些潜在的 Bug。

JavaScript 常见陷阱与易错点解析

JavaScript 是目前应用最广泛的编程语言之一,但其语言特性也带来了一些副作用。无论该语言设计得多么精妙,每天都有大量开发者因疏忽产生 Bug。在指责他人之前,不妨先审视自己是否也陷入了类似的误区。

以下列举几个简短且完全合法的 JavaScript 代码片段,你可以直接在浏览器控制台中运行验证:

代码如下:

typeof NaN === 'number' // true
 
Infinity === 1/0 // true
0.1 + 0.2 === 0.3 // false,前面加括号也一样
"3" + 1 // '31' 
"3" - 1 // 2

这些现象是否让你对 JavaScript 的类型系统产生怀疑?

最小值与浮点数精度

1、JS 最小的值

代码如下:

Number.MIN_VALUE > 0; //true

Number.MIN_VALUE 表示 JavaScript 中能表示的最小正值,其值为 5e-324。尽管它极小,但它仍然是大于 0 的最接近 0 的数。

字符串连接与类型转换

2、字符串连接

代码如下:

("foo" + + "bar") === "fooNaN" //true
"why I am " + typeof + "" // why I am number

JavaScript 解析器会将上述代码解析为 "foo" + (+ "bar")。这里 + "bar" 试图将字符串 "bar" 转换为数字,由于无法转换,结果为 NaN。

parseInt 解析规则

3、parseInt 函数

代码如下:

parseInt('06'); // 6
parseInt('08'); // 0 注意,谷歌新版已修正
parseInt(null, 24) === 23 // true

null 的类型判断

4、null 是不是 object

代码如下:

typeof null // object
null instanceof Object // false

return 语句与分号插入

5、return 返回内容

代码如下:

function myjson()
{
return
   [
2
   ]
}
myjson(); // undefined

return 语句返回的内容必须与 return 关键字位于同一行。如果换行,JavaScript 会自动插入分号,导致返回 undefined。

数字表示与精度问题

6、奇怪的数字

代码如下:

012 == 12 // false
'012' == 12 // true
"3" + 1 // '31'
"3" - 1 // 2
0.1 + 0.2 == 0.3 // false
0.1 + 0.7 == 0.8 // false
0.2 + 0.7 == 0.9 // false
9999999999999999 // 10000000000000000
9999999999999999-1 //10000000000000000
111111111111111111111 // 111111111111111110000

arguments 对象与参数引用

7、诡异的参数

代码如下:

function hello(what) {
alert(arguments[0]); //vicky
what = "world";
return "Hello, " + arguments[0] + "!";
}
hello("vicky"); //"Hello, world!"

隐式转换与相等性比较

8、让人头大的等号

代码如下:

NaN === NaN; // false
[] == false; // true
"" == false; // true
null == false; // false
[] == ![] // true
window.window == window // true
window.window === window // false,有些浏览器是true
window == document // true,有些浏览器是false
("0" && {}) == 0 // false
(0 && {}) == 0 // true
0 == "0" // true
[] == 0 // true
作者最新文章