我的最佳实践: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)

4. 分号

// you want to return 5 and have ugly formatting:
return
5

// JavaScript Interpretation:
return;
5;

5. 逻辑运算符 && 和 ||

表达式也可以这样连接起来,从而写出史上最短的 if 语句,也就是一种语法糖:

这种写法也常用来设置默认值:

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)。