JavaScript 经验分享与注意事项


避免全局变量

  • 请尽量少地使用全局变量。
  • 它包括所有的数据类型、对象和函数。
  • 全局变量和函数可被其他脚本覆盖。
  • 请使用局部变量替代,并学习如何使用闭包。

始终声明局部变量

  • 所有在函数中使用的变量应该被声明为局部变量。
  • 局部变量必须通过 var 关键词来声明,否则它们将变成全局变量。
  • 严格模式不允许未声明的变量。

在顶部声明

一项好的编码习惯是把所有声明放在每段脚本或函数的顶部。

这么做的好处是:

  1. 获得更整洁的代码
  2. 提供了查找局部变量的好位置
  3. 更容易避免不需要的全局变量
  4. 减少不需要的重新声明的可能性
  1. // 在顶部声明
  2. var firstName, lastName, price, discount, fullPrice;
  3. // 稍后使用
  4. firstName = "埃隆";
  5. lastName = "马斯克";
  6. price = 19.90;
  7. discount = 0.10;
  8. fullPrice = price * 100 / discount;

也可以用于循环变量:

  1. // 在顶部声明
  2. var i;
  3. // 稍后使用
  4. for (i = 0; i < 5; i++) {

默认地,JavaScript 会将所有声明移至顶部(JavaScript hoisting)。


初始化变量

在您声明变量时对其进行初始化是个好习惯。

这么做的好处是:

  1. 更整洁的代码
  2. 在单独的位置来初始化变量
  3. 避免未定义值
  1. // 在开头进行声明和初始化
  2. var firstName = "",
  3. lastName = "",
  4. price = 0,
  5. discount = 0,
  6. fullPrice = 0,
  7. myArray = [],
  8. myObject = {};

变量初始化使我们能够了解预期用途和预期的数据类型。


请不要声明数值、字符串或布尔对象

请始终将数值、字符串或布尔值视作初始值,而非对象。

如果把这些类型声明为对象,会拖慢执行速度,并产生负面影响:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p>切勿将字符串创建为对象。</p>
  5. <p>字符串和对象无法安全地进行比较。</p>
  6. <p id="demo">
  7. <script>
  8. var x = "马斯克"; // x 是字符串
  9. var y = new String("马斯克"); // y 是对象
  10. document.getElementById("demo").innerHTML = x===y;
  11. </script>
  12. </body>
  13. </html>

或者甚至更糟:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p>切勿将字符串创建为对象。</p>
  5. <p>JavaScript 无法比较对象。</p>
  6. <p id="demo">
  7. <script>
  8. var x = new String("马斯克");
  9. var y = new String("马斯克");
  10. document.getElementById("demo").innerHTML = x==y;
  11. </script>
  12. </body>
  13. </html>

请勿使用 new Object()

  • 请使用 {} 来代替 new Object()
  • 请使用 "" 来代替 new String()
  • 请使用 0 来代替 new Number()
  • 请使用 false 来代替 new Boolean()
  • 请使用 [] 来代替 new Array()
  • 请使用 /()/ 来代替 new RegExp()
  • 请使用 function (){}来代替 new Function()
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p id="demo">
  5. <script>
  6. var x1 = {};
  7. var x2 = "";
  8. var x3 = 0;
  9. var x4 = false;
  10. var x5 = [];
  11. var x6 = /()/;
  12. var x7 = function(){};
  13. document.getElementById("demo").innerHTML =
  14. "x1: " + typeof x1 + "<br>" +
  15. "x2: " + typeof x2 + "<br>" +
  16. "x3: " + typeof x3 + "<br>" +
  17. "x4: " + typeof x4 + "<br>" +
  18. "x5: " + typeof x5 + "<br>" +
  19. "x6: " + typeof x6 + "<br>" +
  20. "x7: " + typeof x7 + "<br>";
  21. </script>
  22. </body>
  23. </html>

要注意自动类型转换

要注意数值可能会被意外转换为字符串或 NaN(Not a Number)。

JavaScript 属于弱类型语言,变量可包含不同的数据类型,并且变量隐式转换为其数据类型:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p id="demo">
  5. <script>
  6. var x = "Hello";
  7. var x = 5;
  8. document.getElementById("demo").innerHTML = typeof x;
  9. </script>
  10. </body>
  11. </html>

如果进行数学运算,JavaScript 能够将数值转换为字符串:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p>删除注释(在行的开头)以测试每种情况:</p>
  5. <p id="demo">
  6. <script>
  7. var x = 5;
  8. //x = 5 + 7; // x.valueOf() 是 12,typeof x 是数字
  9. //x = 5 + "7"; // x.valueOf() 是 57,typeof x 是字符串
  10. //x = "5" + 7; // x.valueOf() 是 57,typeof x 是字符串
  11. //x = 5 - 7; // x.valueOf() 是 -2,typeof x 是数字
  12. //x = 5 - "7"; // x.valueOf() 是 -2,typeof x 是数字
  13. //x = "5" - 7; // x.valueOf() 是 -2,typeof x 是数字
  14. //x = 5 - "x"; // x.valueOf() 是 NaN,typeof x 是数字
  15. document.getElementById("demo").innerHTML = x.valueOf() + " " + typeof x;
  16. </script>
  17. </body>
  18. </html>

用字符串减去字符串,不会产生错误而是返回 NaN(Not a Number):

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p id="demo">我的第一个段落</p>
  5. <script>
  6. document.getElementById("demo").innerHTML = "Hello" - "Kitty";
  7. </script>
  8. </body>
  9. </html>

使用 === 比较

== 比较运算符总是在比较之前进行类型转换(以匹配类型)。

=== 运算符会强制对值和类型进行比较:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p>删除注释(在行的开头)以测试每种情况:</p>
  5. <p id="demo">
  6. <script>
  7. var x;
  8. //x = (0 == ""); // true
  9. //x = (1 == "1"); // true
  10. //x = (1 == true); // true
  11. //x = (0 === ""); // false
  12. //x = (1 === "1"); // false
  13. //x = (1 === true); // false
  14. document.getElementById("demo").innerHTML = x;
  15. </script>
  16. </body>
  17. </html>

请为参数设置默认值

如果调用函数时缺少一个参数,那么这个缺失参数的值会被设置为 undefined

undefined 值可能会让您的代码报错,因此为参数设置默认值是一个好习惯。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p>将默认值设置为函数参数。</p>
  5. <p id="demo">
  6. <script>
  7. function myFunction(x, y) {
  8. if (y === undefined) {
  9. y = 0;
  10. }
  11. return x * y;
  12. }
  13. document.getElementById("demo").innerHTML = myFunction(4);
  14. </script>
  15. </body>
  16. </html>

用 default 来结束 switch

请使用使用 default 来结束您的 switch 语句。即使您认为没有这个必要。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p id="demo">
  5. <script>
  6. var day;
  7. switch (new Date().getDay()) {
  8. case 0:
  9. day = "周日";
  10. break;
  11. case 1:
  12. day = "周一";
  13. break;
  14. case 2:
  15. day = "周二";
  16. break;
  17. case 3:
  18. day = "周三";
  19. break;
  20. case 4:
  21. day = "周四";
  22. break;
  23. case 5:
  24. day = "周五";
  25. break;
  26. case 6:
  27. day = "周六";
  28. break;
  29. default:
  30. day = "未知";
  31. }
  32. document.getElementById("demo").innerHTML = "今天是:" + day;
  33. </script>
  34. </body>
  35. </html>

避免使用 eval()

eval() 函数用于将文本作为代码来允许。在几乎所有情况下,都没有必要使用它。因为允许任意代码运行,它同时也意味着安全问题。