JavaScript 常见陷阱与避坑指南
本文列举了 JavaScript 开发中常见的七个陷阱,包括浮点运算精度丢失、加号运算符重载、自动分号插入机制、typeof 对 null 的判断偏差、特殊值比较规则、字符串替换限制以及 parseInt 的隐式进制转换。通过具体代码示例,帮助开发者理解这些行为背后的原理并避免常见错误。
引言
翻译讲究“信、雅、达”,本文可能难以企及后两者,但力求准确传达原意,确保信息不偏差。
编程中的“陷阱”(gotcha)指的是系统中那些出乎意料且文档未充分说明的特性,而非程序错误。这些特性往往让初学者对 JavaScript 望而却步。在我看来,尽管 JavaScript 因能在所有浏览器中运行而成为使用最广泛的语言之一,但它也是被研究最少的一门语言。让我们从一个基础示例开始探讨。
浮点运算陷阱
1. 浮点运算
这往往是让不熟悉 JavaScript 的开发者在尝试执行数学运算时感到挫败的主要原因。
- <script>
- alert(0.02 / 0.1); //0.19999999999999998
- alert(1.14 * 100); //113.99999999999999 ;)
- </script>
此时,Math.round() 函数就能派上用场来修正结果。
加号运算符重载
2. 加号操作符的重载
"+" 加号运算符既执行算术加法,又执行字符串连接。如果正确使用,它非常便利。让我们通过示例来观察。
- <script>
- var msg, one="1";
- msg = 2 + "1"; // msg = "21"
- msg = 2 + one; // msg = "21"
- msg = 1 + 1 + 1 + " musketeers"; // msg = "3 musketeers"
- msg = "Bond " + 0 + 0 + 7; //msg = "Bond 007"
- </script>
上述行为源于运算从左到右的执行顺序,类型转换取决于表达式中出现的字符串或数字类型。
自动分号插入机制
3. 行尾自动插入分号
JavaScript 会在行尾自动插入分号 ";",让我们通过一个简单的示例来看看这种情况。
- <script>
- function returnSame(a){
- return //Inserts semi-colon to convert to return;
- a //a becomes a; - Unreachable
- }
- alert(returnSame(2)); //Output is undefined
- </script>
在创建对象或使用对象值时,这个神奇的分号插入机制会使情况变得更加复杂。
typeof 操作符的偏差
4. typeof 操作符
typeof 是一个一元操作符,其运算结果往往与预期不符。令人惊讶的是,对 "null" 进行 typeof 运算的结果是 "object"。
- <script>
- var obj={}; //object created using object literal
- var arr=[]; //array created by array literal
- alert(typeof(obj)); //object - Good
- alert(typeof(arr)); //object - Bad
- alert(typeof(null)); //object - Ugly! ;)
- </script>
它仅能返回对象的原始类型。
特殊值与比较规则
5. false, null, undefined, NaN, Infinity
尽管它们看起来相似,但代表不同的含义。JavaScript 有 3 种基本数据类型:数字(numbers)、字符串(strings)和布尔值(boolean),此外还有两个不太重要的数据类型:"undefined" 和 "null"。按照 "==" 运算符运算,null 和 undefined 是相等的。
- <script>
- var a;
- alert (a); //undefined
- alert (1/0); //Infinity
- alert (0/0); //NaN
- 0/0 == 0/0; //false - a NaN != NaN
- alert (b); //error
- </script>
字符串替换限制
6. 字符串只替换第一个匹配的字符
与 PHP 或其他编程语言不同,默认情况下,JavaScript 的字符串替换只替换第一个出现的匹配字符。
- <script>
- var nospace = "I dont need spaces".replace(" ","_");
- alert(nospace); //I_dont need spaces - Only first occurence
- var nospace = "I dont need spaces".replace(/ /g,"_");
- alert(nospace); //I_dont_need_spaces
- </script>
parseInt 隐式进制转换
7. parseInt 函数
parseInt 用于将字符串转换为整数类型。该函数可传入两个参数,第二个参数指定进制。这里十进制用 10 指定。如果没有指定进制,parseInt 函数会尝试自动推断合适的进制。如果是这种情况,以 0 开头的字符串将被转换为 8 进制。
- <script>
- var str = "017";
- var strInt = parseInt(str); //strInt = 15 ;)
- var strInt = parseInt(str,10); //strInt = 17
- </script>
为什么叫JavaScript:语言命名由来及与Java的历史渊源
2026-11-05 11:37:48
JS获取当前时间年月日时分秒并格式化为YYYY-MM-DD HH:mm:ss
2026-11-04 21:25:21
不同语言间JS与Java/Python加密结果不一致怎么办
2026-11-04 18:27:23
Mock.js 拦截 Axios 和 Fetch 请求的原理与配置方法
2026-11-04 08:13:59
JS怎么获取当前日期并格式化为YYYY-MM-DD
2026-11-03 18:47:03
