JavaScript 常见陷阱与避坑指南

作者:阿沐时间:2026-10-23 16:56:14浏览:519

本文列举了 JavaScript 开发中常见的七个陷阱,包括浮点运算精度丢失、加号运算符重载、自动分号插入机制、typeof 对 null 的判断偏差、特殊值比较规则、字符串替换限制以及 parseInt 的隐式进制转换。通过具体代码示例,帮助开发者理解这些行为背后的原理并避免常见错误。

引言

翻译讲究“信、雅、达”,本文可能难以企及后两者,但力求准确传达原意,确保信息不偏差。

编程中的“陷阱”(gotcha)指的是系统中那些出乎意料且文档未充分说明的特性,而非程序错误。这些特性往往让初学者对 JavaScript 望而却步。在我看来,尽管 JavaScript 因能在所有浏览器中运行而成为使用最广泛的语言之一,但它也是被研究最少的一门语言。让我们从一个基础示例开始探讨。

浮点运算陷阱

1. 浮点运算

这往往是让不熟悉 JavaScript 的开发者在尝试执行数学运算时感到挫败的主要原因。

  1. <script>
  2. alert(0.02 / 0.1); //0.19999999999999998
  3. alert(1.14 * 100); //113.99999999999999 ;)
  4. </script>

此时,Math.round() 函数就能派上用场来修正结果。

加号运算符重载

2. 加号操作符的重载

"+" 加号运算符既执行算术加法,又执行字符串连接。如果正确使用,它非常便利。让我们通过示例来观察。

  1. <script>
  2. var msg, one="1";
  3. msg = 2 + "1"; // msg = "21"
  4. msg = 2 + one; // msg = "21"
  5. msg = 1 + 1 + 1 + " musketeers"; // msg = "3 musketeers"
  6. msg = "Bond " + 0 + 0 + 7; //msg = "Bond 007"
  7. </script>

上述行为源于运算从左到右的执行顺序,类型转换取决于表达式中出现的字符串或数字类型。

自动分号插入机制

3. 行尾自动插入分号

JavaScript 会在行尾自动插入分号 ";",让我们通过一个简单的示例来看看这种情况。

  1. <script>
  2. function returnSame(a){
  3. return //Inserts semi-colon to convert to return;
  4. a //a becomes a; - Unreachable
  5. }  
  6. alert(returnSame(2)); //Output is undefined
  7. </script>

在创建对象或使用对象值时,这个神奇的分号插入机制会使情况变得更加复杂。

typeof 操作符的偏差

4. typeof 操作符

typeof 是一个一元操作符,其运算结果往往与预期不符。令人惊讶的是,对 "null" 进行 typeof 运算的结果是 "object"。

  1. <script>
  2. var obj={}; //object created using object literal
  3. var arr=[]; //array created by array literal
  4. alert(typeof(obj)); //object - Good
  5. alert(typeof(arr)); //object - Bad
  6. alert(typeof(null)); //object - Ugly! ;)
  7. </script>

它仅能返回对象的原始类型。

特殊值与比较规则

5. false, null, undefined, NaN, Infinity

尽管它们看起来相似,但代表不同的含义。JavaScript 有 3 种基本数据类型:数字(numbers)、字符串(strings)和布尔值(boolean),此外还有两个不太重要的数据类型:"undefined" 和 "null"。按照 "==" 运算符运算,null 和 undefined 是相等的。

  1. <script>
  2. var a;
  3. alert (a); //undefined
  4. alert (1/0); //Infinity
  5. alert (0/0); //NaN
  6. 0/0 == 0/0; //false - a NaN != NaN
  7. alert (b); //error
  8. </script>

字符串替换限制

6. 字符串只替换第一个匹配的字符

与 PHP 或其他编程语言不同,默认情况下,JavaScript 的字符串替换只替换第一个出现的匹配字符。

  1. <script>
  2. var nospace = "I dont need spaces".replace(" ","_");
  3. alert(nospace); //I_dont need spaces - Only first occurence
  4. var nospace = "I dont need spaces".replace(/ /g,"_");
  5. alert(nospace); //I_dont_need_spaces
  6. </script>

parseInt 隐式进制转换

7. parseInt 函数

parseInt 用于将字符串转换为整数类型。该函数可传入两个参数,第二个参数指定进制。这里十进制用 10 指定。如果没有指定进制,parseInt 函数会尝试自动推断合适的进制。如果是这种情况,以 0 开头的字符串将被转换为 8 进制。

  1. <script>
  2. var str = "017";
  3. var strInt = parseInt(str); //strInt = 15 ;)
  4. var strInt = parseInt(str,10); //strInt = 17
  5. </script>
作者最新文章