看看这段代码
let a = 10;
let b = a;
a = 0;
当运行这段代码以后,a
和 b
的值分别是多少?在你接下去读之前先想想这个答案。
如果你已经写过一阵 Javascript,你可能会抱怨:“这段代码太简单了,我天天都在写啊,你到底想干嘛?”
然而这个练习并不是为了向你介绍什么是变量。我们确信你已经对它们非常的熟悉了。然而,这将会促使你注意并反思 思维模式
再认真读一下上面的代码,确信一下结果是什么。(稍后告诉你为什么要认真读)。
当你再读一次这段代码,当你集中注意力的时候,你会逐渐注意到一些事情。你可能会注意到一些代码的“独白”:
-
let a = 10;
- 声明一个叫
a
的变量,将其设置为10
- 声明一个叫
-
let b = a;
- 声明一个变量
b
,将其设置为a
- 等等,
a
是什么?是10
啊,所以b
也是10
- 声明一个变量
-
a = 0;
- 将变量
a
设为0
- 将变量
-
所以现在
a
是0
,b
是10
,这就是答案了。
也许你的“独白”会有些不一样。有可能你会用“赋值”代替“设置”,也或许你会有用不同的顺序来考虑它。也有可能你想到了不同的结果。请注意为什么会造成不同的结果。注意这些“独白”其实并不代表你脑子力真正的想法。你有可能会说“将 b
设置给 a
”,但它是不是意味着设置一个变量?
你可能会在其中发现一些熟悉的基础编程概念(例如变量)及操作(例如给变量赋值),这些都是一些你根深蒂固理解的一些类比,有一些还是来自真实的世界。另外一些可能来自你学习过的另外的领域,比如数学中的数字。这些类比可能会互相重叠或者相悖,但仍然能帮助你合理地理解代码发生了什么。
举个例子,许多人在学习变量的时候,都会被告知关于“盒子”中装入“物品”的类比。尽管你不一定能在看到变量的时候生动地想象出“盒子”,但是它仍然会在你的想象中“盒子化”。这些在你脑中近似的类比就叫做“思维模式”。如果你编程很久了,可能会有些困难,但请仍然尝试注意并反省你的思维模式。它们可能是视觉、空间以及机械思维的结合。
这些直觉(比如变量的“盒子化”)影响着我们如何去阅读代码的过程。但是有些时候,我们的思维模型是错的。可能一些我们读过的早期教程为了便于解释而忽略了一些正确性。也可能某些其他语言特性引入的一些错误的概念,比如在之前学习的其他语言中的 this
就是个例子。也许我们我们从一些代码片段中推断出了一些思维模型,但是从来没有验证它是否准确。
确定并修复这些问题是 Just Javascript 这本书的全部。我们会逐步构建(也许是重构)你关于 JavaScript 有用并准确的思维模型。一个好的思维模型将会帮助你更快找到并修复 bug,以及更好地理解其他人的代码,并在你编写自己的代码时会更加自信。
(顺便说一下,a
是 0
,b
是 10
是正确答案)
“Thinking, Fast and Slow” 是 Daniel Kahneman 广为认知的一本非小说类书。它提出人类在思考的时候会用到两个不同的“系统”。
只要可能,我们通常倾向使用“快”系统。我们与许多动物共享这个系统,比如我们在走路时不会摔倒这样神奇的力量。这个“快”系统非常擅长模式匹配(生存必须!)并且“做出反应”。但它不擅长做计划。
特别地,感谢前额叶的发展,人类同时拥有“慢”系统。这个“慢”系统可以对复杂的问题进行逐步推理。它让我们可以规划未来的事情,参与讨论,或者遵循数学证明。
因为使用“慢”系统会耗费很多的精力,我们倾向默认使用“快”系统 ———— 即使是在做智力需求比较高的任务,比如编程。
想象你正处在许多工作中间,并且想快速确定这个函数做了什么。快速看一下这段代码:
function duplicateSpreadsheet(original) {
if (original.hasPendingChanges) {
throw new Error('You need to save the file before you can duplicate it.');
}
let copy = {
created: Date.now(),
author: original.author,
cells: original.cells,
metadata: original.metadata,
};
copy.metadata.title = 'Copy of ' + original.metadata.title;
return copy;
}
你可能注意到了:
- 这个函数复制了一个分页
- 它会在原始分页没有保存时报错
- 它将会以 “Copy of” 做为新分页的标题开头
还有什么你可能没注意到的是(如果你注意到了,就太棒了!)这段代码可能意外地改变了原始分页的标题。
像这样这些隐藏的 bug 在每天都在每个程序员身上发生。但现在你知道了有个 bug 的存在,你在读这段代码的时候会感觉不一样吗?如果你已经在“快”模式里读了这段代码,你可能需要切换到更耗费精神的“慢”模式来找到这个问题。
在“快”模式里,我们通过命名,注释来猜测代码的意图以及整体结构。在“慢”模式里,我们会逐步逐步追踪代码发生了什么。
这就是为什么正确的思维模式非常重要。在我们的脑中模拟一个计算机非常困难 ———— 而这种努力会因为错误的思维模式而被浪费。
如果你找不到 bug,也别担心。这意味这你非常需要这个课程!在接下来的模块里,我们会一起重构关于 JavaScript 的思维模式,这样你就会轻易地发现 bug 了。
在下一个模块里,我们将会开始构建一些 JavaScript 最基础的概念的思维模式 —— 值与变量。