阅读以下代码:

  1. let a = 10;
  2. let b = a;
  3. 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’’,但是设置变量a意味着什么?
你可能会发现,对于每个熟悉的基本编程概念(例如变量)和对其进行的操作(例如设置其值),都有与之关联的一组根深蒂固的类比。其中一些可能来自现实世界,其他的可能会从你最初学习的其他领域中重新使用,例如数学中的数字。这些类比可能会重叠甚至相互矛盾,但是它们仍然可以帮助你了解代码中正在发生的事情。
例如,许多人第一次可能会将变量比作“盒子”,你可以把东西放进去。之后当你看到一个变量时,你不再将其想象成盒子,但是它们可能在你的脑海中仍然表现出“方形”。你头脑中这种近似或者类比的运作方式称为“心理模型”。如果你已经编程很长时间了,这可能很难,但是试着去刻意的注意和反省你的心理模型。它们可能是视觉、空间和机械思维的组合。
这种直觉思维(如变量的“灵活性”)影响我们一生阅读代码的方式。但是有时候,我们的思维模式是错误的。也许我们早期阅读的教程为了简化说明而牺牲了正确性。也许我们从最初学习的一种语言中,我们错误地转移了关于不同语言功能的直觉思维,例如this。也许我们是从一些代码中推断出一个心理模型,却从未真正验证过它是否准确。
认识和修复这些问题就是 just JavaScript的全部目的。我们将逐步构建(或可能重建)你的JavaScript思维模型,以使其更加准确和有用。良好的思维模式将帮助您更快地发现和修复错误,更好地理解他人的代码,并对自己编写的代码充满信心。
(顺便说一句,a为0,b为10是正确的答案。)

_编码,快和慢

丹尼尔·卡尼曼(Daniel Kahneman)的《Thinking, Fast and Slow》是一本广受欢迎的非小说类书籍。其中心论点是,人类在思考时会使用两种不同的“系统”。
只要有可能,我们就使用“快速”思维模式。我们与许多动物共享此种思维模式,这给了我们惊人的力量,例如走路时始终不会跌倒。这种“快速”思维模式适用于模式匹配(生存所必需!)和“胆量反应”。但这并适合“计划”。
由于额叶的发展,人类也独有的拥有“慢速”思维模式。这种“慢速”的思维模式负责复杂的逐步推理。它使我们能够计划未来的事件,进行争论或遵循数学证明。
因为使用“慢速”思维模式非常费时费力,所以即使在处理诸如编码之类的脑力工作时,我们也倾向于使用“快速”思维模式。
想象一下,您正处于大量工作之中,并且想要快速确定此功能的作用。快速浏览如下代码段:

  1. function duplicateSpreadsheet(original) {
  2. if (original.hasPendingChanges) {
  3. throw new Error('You need to save the file before you can duplicate it.');
  4. }
  5. let copy = {
  6. created: Date.now(),
  7. author: original.author,
  8. cells: original.cells,
  9. metadata: original.metadata,
  10. };
  11. copy.metadata.title = 'Copy of ' + original.metadata.title;
  12. return copy;
  13. }

你可能已经知道:

  • 此函数功能复制电子表格。
  • 如果未保存原始电子表格,就会抛出错误。
  • 它将“Copy of”添加到新电子表格的标题上。

你可能没有注意到(如果你这样想的话,确实很棒!)此函数同时更改了原始电子表格的标题。
每天像这样遗漏的bug都会在每个程序员中发生。这样的话,既然你知道存在这样的问题,为什么你不改变自己阅读代码的思维呢?如果您一直在“快速”思维模式下阅读代码,那么切换到的“慢速”思维模式下进行阅读可能会更费力。
在“快速”思维模式下,我们根据命名,注释及其整体结构来猜测代码的作用。在“慢速”思维模式下,我们逐步追溯代码的作用。
这就是为什么拥有正确的思维模式是如此重要的原因。在我们的脑海中模拟一台计算机已经够难了,但是这台计算机却被我们用错误的思维模式所浪费。
如果你还没意识到这一点,请不要担心,这意味着你可以充分利用本课程!在接下来的章节中,我们将一起重建我们的JavaScript思维模型,以便你每天都可以意识到该错误。
在下一个章节中,我们将开始为一些最基本的JavaScript概念(值和变量)构建思维模型。

译者注:

原文订阅地址:https://justjavascript.com/,订阅之后会每天凌晨通过email给你发送一章节(莫贪快,就如本章节提到了,现在开始训练“慢速”思维模式),直到发送到Dan更新的步伐,就会阅读到Dan同步更新的章节。