我的最佳实践:JavaScript
1. 禁用缓存
Firefox:
打开开发者工具 -> 打开设置 (F1) -> “禁用 HTTP 缓存(工具箱打开时)”
Chrome:
打开开发者工具 -> 打开设置 (F1) -> "Disable cache (while DevTools is open)"
2. 保持 JS 控制台打开
在开发者工具中打开“控制台”标签页并一直开着,这样第 1 步的设置才会持续生效,你也能及时发现网络和 JS 中的错误。
另外推荐这个插件,它能把 JS 错误显示得更醒目,哪怕你自己偶尔忘了看控制台:
3. JavaScript:必读《你不知道的 JavaScript》(You Don't Know JS)
- You Don't Know JS (1st Edition)
- 解释了为什么要避免使用
this - 解释了为什么 JS 里有时会发生看似奇怪的事(关键词:词法作用域、闭包)
4. 分号
- 永远都要加
- 虽然不是强制的,但它能帮你避开像这样的坑:Stack Overflow
- JavaScript 会自动插入分号:
// you want to return 5 and have ugly formatting:
return
5
// JavaScript Interpretation:
return;
5;
5. 逻辑运算符 && 和 ||
- 在 Java 中,
a && b和a || b按照布尔代数求值。a和b必须是布尔值。 - 在 JavaScript 中:
- 对于
a && b,如果a为 true,则返回b - 对于
a || b,如果a为 false,则返回b
- 对于
表达式也可以这样连接起来,从而写出史上最短的 if 语句,也就是一种语法糖:
isAdmin && showDeleteButton();- (严格来说,这已经不算语句了)
这种写法也常用来设置默认值:
let sendNewsletter = form.getNewsletterOptIn() || false;
6. JavaScript 是按引用传递还是按值传递?
JavaScript 在这一点上很有意思。例如:
function changeStuff(a, b, c) {
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
输出如下:
10
changed
unchanged
如果 obj1 根本不是引用,那么修改 obj1.item 对函数外部的 obj1 不会有任何影响。
如果参数是真正的引用,那么所有值都会改变:num 会变成 100,obj2.item 会变成“changed”。然而实际上,num 仍然是 10,obj2.item 仍然是“unchanged”。
实际上,传入的元素是按值传递的。只不过,按值传递的这个值本身就是一个引用。从技术上讲,这被称为共享传递(call-by-sharing)。
在实践中这意味着:如果你修改参数本身(如 num 和 obj2),不会影响传入函数的原始对象。但如果你修改参数内部的值,这些修改就会保留下来(如 obj1)。