JavaScript核心原理解析
周爱民
《JavaScript语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
立即订阅
3620 人已学习
课程目录
已更新 21 讲 / 共 21 讲
0/3登录后,你可以任选3讲全文学习。
开篇词 (1讲)
开篇词 | 如何解决语言问题?
免费
从零开始:JavaScript语言是如何构建起来的 (5讲)
01 | delete 0:JavaScript中到底有什么是可以销毁的
02 | var x = y = 100:声明语句与语法改变了JavaScript语言核心性质
03 | a.x = a = {n:2}:一道被无数人无数次地解释过的经典面试题
04 | export default function() {}:你无法导出一个匿名函数表达式
05 | for (let x of [1,2,3]) ...:for循环并不比使用函数递归节省开销
从表达式到执行引擎:JavaScript是如何运行的 (6讲)
06 | x: break x; 搞懂如何在循环外使用break,方知语句执行真解
07 | `${1}`:详解JavaScript中特殊的可执行结构
08 | x => x:函数式语言的核心抽象:函数与表达式的同一性
09 | (...x):不是表达式、语句、函数,但它却能执行
10 | x = yield x:迭代过程的“函数式化”
11 | throw 1;:它在“最简单语法榜”上排名第三
从原型到类:JavaScript是如何一步步走向应用编程语言的 (6讲)
12 | 1 in 1..constructor:这行代码的结果值,既可能是true,也可能是false
13 | new X:从构造器到类,为你揭密对象构造的全程
14 | super.xxx():虽然直到ES10还是个半吊子实现,却也值得一讲
15 | return Object.create(new.target.prototype):做框架设计的基本功:写一个根类
16 | [a, b] = {a, b}:让你从一行代码看到对象的本质
17 | Object.setPrototypeOf(x, null):连Brendan Eich都认错,但null值还活着
不定期加餐 (3讲)
加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?
免费
加餐 | 捡豆吃豆的学问(下):这门课该怎么学?
免费
加餐 | 让JavaScript运行起来
免费
JavaScript核心原理解析
登录|注册

加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?

周爱民 2019-11-27
00:00
13:58
讲述:周爱民 大小:12.81M
你好,我是周爱民,今天又到了我的《JavaScript 核心原理解析》。
不过与以往不同,今天不上正经课,讲点课外的话。前两天极客时间的编辑老师找我,开了一个会,认认真真地讨论了一下这门课程,认为当务之急,是给同学们开个小灶,要好好讲一下“怎么学这门课程”。因为这才短短的讲了 1/3,许多同学就已经跟不上了。
说到开小灶,我第一个就是想到了“吃”。
为什么呢?因为我父亲就是厨师,正正经儿地考过厨师证,说不得多有名气,但一个县城里面,能跟他水平看齐的,也就三两个人而已。我的哥哥后来也随了父业,做了厨师,精通京、粤、淮扬多个菜系,更是拿了一级厨师的证书。
而我呢,没学厨,从父亲手上学到的唯一功夫,就是一个“吃”字。

什么是“会吃”?

会吃这件事,其实不是下嘴的功夫。这跟绝大多数人想得不同。下嘴就吃,就算有再多的法子,也无非是生啃细嚼;花样再多,也不过是甩动大腮帮子,劳力活而已。
真正会吃,说的是三件事,第一是食材,第二是味道,第三件,就单单一个“”字。
吃货世界里的“食材”,搁在我们今天的话题里,就是这二十来讲的课程。开课之前,有同学便过来打探,问我这个课程都讲些什么,看看值不值得一听。我就索性问了问他,你想听些什么呢?
VUE?没有。
HTML、CSS?没有。
前端?客户端?浏览器?手机 App?……没有,统统没有。
那位同学不死心,又悻悻然地问了一句:总该讲点 Node.js、React Native,又或者是 NPM 之类的吧?
我索性给他摊了底牌:二十节课程里面,就只算是提到这些名词,大概也不超过五次。
那位同学回了一句:那你让我学什么?

“食材”的问题

好问题啊!学什么呢?
我记得在豌豆荚的时候,有参与一些招聘的工作。老实说,作为架构师,招聘工作通常不是在第一轮,大概会是到第二、三轮的时候,才会轮到我上场。也就是说,我需要面试的,大抵都是其他“面试官”认为“这家伙还有点料”的。
有一次,我的一个面试结束得比较快,在内部的 HR 系统中填写评论的时候,正经才写了四个字,便被其他面试官打断了,他嚷嚷着,几乎快要被整个公司都听到了,说:“爱民老师,人家十几年的一线开发,大型系统都做过那么多,经验很丰富的!你怎么这么点评呢?“
嗯,我在 HR 系统中写评论,起头里的四个字是:水平一般
我想了想,停下写评论,给这个面试官聊聊这四个字的开头。我说,我其实不太常用这种措辞来评论候选人,但这个也算是例外了。为什么呢?因为这个人真的是能力很强,下手很快,做的产品和项目也多,经验非常丰富,但是他确实就是水平一般。
什么叫“水平一般”呢?
因为他学的东西,别人也都学;会的东西,别人也都会;他强的东西,别人一样也强。即使别人今天不如他学得多、会得多,又或者不比他强多少,但是只要花点时间、下点功夫,也就一样儿也不会比他差。他十几年的一线开发,把自己做成了熟手、熟练工,东西会得再多,技巧再熟练,也不过是卖油翁的“但手熟尔”。
我在面试里面,确实问了他几个偏向核心的问题,他也确实知道,很清晰、很准确。但再进一步问原理时,他却是一无所知。所以,我又引导、设问,说:“如果现在让你来考虑这个问题,你会从哪儿入手呢?”那位候选人想了好几个招数,中规中矩,然而无一可用。
这就是关键所在。
“核心原理”不是一些招数技法,不是拿来多练多用就行了的。所谓“核心”呢,不见得是大家都知道的——一眼望去,万千条路径之中,找到最正确的那一条,才是核心。但是这个东西可以教,也可以记,下次看见这个路,照着走就是了。所以,大公司里有所谓的“核心团队”,新人进去,不消半年工夫,功力就大增了,出来能带一个团队了。咦,带团队做什么呢?冲锋陷阵啊,杀敌交人头啊!反正,和上面说的“吃”一样,还是劳力活。
所以,就算是在“核心团队”里,他们也只是帮你指出核心之所在,最多教你会一些套路,让人净增功力。但是这样的核心只是“死东西”,不懂得核心的原理,就如同上面说过的那位面试候选人一样,出的都是些中规中矩的招数。
“中规中矩”有什么不好么?
确实,有些时候就是不好。“中规中矩”就是所谓的“一般”。所谓的“一般”不是指你能力一般,而是指你眼界一般、思想一般,对你面前这个事物的理解程度,也是一般。
所以,所谓“水平一般”,是因为学的是“一般”的东西,再怎么学,还是一般。
汉语中,“一般”这个词,是指跟别的一样,例如“一般无二”,而不仅仅是指“普通”,也并非贬义。

这门课到底讲什么呢?

《JavaScript 核心原理解析》这门课,核心不是在讲 JavaScript 如何用,或者如何学习 JavaScript。我在开这门课,列出这二十多行代码作为标题时,就说过,我要讲的是语言。
语言最核心的部分也有两个,第一个是语言的构成,第二个是如何构成。我在这门课里,主要还是讲“如何构成”的,因为 ECMAScript 就是以“如何构成(也就是如何按照 ECMAScript 规范来实现一个 JavaScript)”为制订规范的主要目标和方向的。
在内容上面,这门课跳过了对“构成一门语言的那些基础元素(也就是语言的构成)”的讨论,而是直接进入到“如何将基础元素组织起来,成为 JavaScript”。比如,我就没讲什么是动态语言,或者也没有讲什么是标识符。这里有两点是很不幸的:
ECMAScript 中没有明确地写“我是动态语言”;
ECMAScript 里面明确地使用了“标识符”这个名词。
为什么“这两点”都是很不幸的呢?
因为无论有没有明确地使用这些名词,在 ECMAScript 中,这些概念都没有规范性质的定义。这是因为 ECMAScript 是直接面向“语言 / 引擎的编写者”,因此这个规范就默认它的读者是了解这些基础的或者学术的概念的。就好象它不会解释什么是二进制,什么是位运算一样,因为它默认是在计算机这个领域里的。
然而,我想你应该不是“计算机语言 / 编程语言学”的专家,因此那些所谓“构成一门语言的基础元素”,其实你不懂,也是正常的。在听这门课的大多数同学,其实也都一样的不懂。
然而,注意这里的这个词——“一样的”。这也就意味着,只有了解了那些“不一样的”“不懂的”东西,你才会成为“不一般的”。
而这门课程的目的,也正是要让你成为那个“不一般的”。
所以,你需要放下以前你认为你懂的那些东西。如同开篇词中所说的,它们正是阻碍了你前进的东西。比如说,有同学就从第 1 讲开始,就一直被“引用”这个概念困扰,因为他所理解的 JavaScript 的概念与我所讲的完全不同,而且混淆不清。这种状况在评论区中表现得很明显,大多数同学都是在旧有的概念中构建新的概念集合,如同浮沙高塔,原本基础就搭得不对,你再怎么努力,也是上不了这个台阶的。
然而,又如同评论区里的“海绵薇薇”同学一样,只要突破了“引用”这个概念,把旧的东西扔掉,基于这个新的东西来理解,那么再看前几讲的东西,就豁然开朗了。
我所讲的东西,原本并不是什么特别高明的、高深的技巧。问题只是,你要把原本依赖的那些概念、想法、设定,或者你认为正确的那些逻辑一一扔掉,你才能“看到”这些新的东西。
这个扔掉的过程太难。很多年前,我在给一个 Borland 的纪念网页上留下的题字就是:
所见即所得,所见即所碍。
Borland 是“所见即所得”这一开发理念的大成者;而最终,他也是死于对这一概念的固执坚守。
关于“引用”这个概念的突破,我想如果有机会,我会请极客时间的编辑们约请“海绵薇薇”同学来讲一下他如何理解这个东西,以及在理解这个概念前后,对 JavaScript 有哪些不一样的认识。
回头来说这门课程。语言这个东西,其实是你最终要在这门课中看到的“真相的全部”。
我希望你通过这门课程,能真正的了解语言:语言是什么,它长得怎么样,它为什么长成这个样子,它如何成长、长大,又或者变化的。对于语言来说,它的生命的原点在哪里?源动力又在哪里?
举一例来说,在第一模块(也就是前五讲)中,如果你理解了“x = x”表达的意思是“将值赋给引用”(当然前提是,你需要知道并接受“这里的引用和值,不是 JavaScript 中的,而是 ECMAScript 中的概念”)。那么,你就几乎能贯通整个 JavaScript 语言的构造过程,了解所有语句、词法,以及引擎内核结构的设计原理与应用原则。
所以,你现在再看看第一模块的总标题:“从零开始:JavaScript 语言是如何构建起来的 (5 讲)”。

马钰曾经说过

说到这里,可能就会有一些同学听出不同的意思来了:咦,爱民老师好像是在说,他的课程是屠龙秘籍,所以不是一般人学的,或者是一般人学不会的。
当然,绝不是这样的。相反,我对屠龙术与杀鸡刀向来没有偏见,我只是在这里要强调一个东西:这个课程讲的东西,跟平常你听到的并不一样。
尺长寸短,但只要是用在合适的地方,就都是好东西。
相反的,你非得像公孙大娘舞剑一般,去百万军中杀敌,那么你大概就是最先中了黑箭的那一个。关于这一点的不同,我在之前写过的一篇名为《前端要给力之:代码可以有多烂?》的博客文章里面也讲过,那篇文章从一个简单题目一直谈到了模板范型,最后呢,我还是建议大家用最保守的版本来编程序。
为什么?
研究是研究,实战是实战,不要把二者混为一谈。就好比在第 3 讲里说到过的那个面试题,最终我给出了一个应用场景:用来形成链表。然而,如果你真的要在工程项目中这样去写链表,那么大概第二天就被开除了。将这个代码写入 jQuery 的那个提交者有没有被开除,我可不知道,反正我见到这样的提交者,是要打板子的。
说回正题。我仅仅告诉你这个东西“与众不同”是不够的。毕竟,你听这堂课的目的,还是要学懂它,对吧。
然而你可知道,历史上有一个人,正好是怎么学都学不会东西的。他有七个师傅,个个是江湖知名的大侠,个个也都呕心沥血,然而却教出来个一个弱鸡,还没行走江湖,初遇敌手就被人抓住了脚给扔出去了。这个历史人物来自金庸大师的《射雕英雄传》,就是郭靖。你看,我在这里给你说这个故事,可不是闲扯,因为书中有人说了一句话,道出了这个郭靖“学不会”的实质。书中第 32 回写道,那道人问道:
“你这六位师父都是武林中顶尖儿的人物,……你又不是不用功,为什么十年来进益不多,你可知道什么原因?”
郭靖道回答说:
“那是因为弟子太笨,师父们再用心教也教不会。”
这时候那位道人就笑了,说了一句古今以来,求学问道最核心的要义,这句话,原话就是:
“那未必尽然,这是教而不明其法,学而不得其道。”
所以,关于我们今天说的这一门课程,“学不好、或者学不会”,其关键就在这位道人——马钰(不是马云)——说过的这句话:教者要有其法,而学者要得其道。
取消
完成
0/1000字
划线
笔记
复制
unpreview
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《JavaScript核心原理解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • 潇潇雨歇
    确实,学一个东西最好要去了解它的本质,深入底层的原理。老师这门课很好,让我知道很多深层次,本质上的东西,改变了一些认知,让我越来越觉得去源头学知识的重要性。比如js这门语言如何来的,又是如何构成的,把这些都搞通,语言也就真的通了。之前学习就是存在老师讲的问题,学来学去都是一般的知识,一直学并没有提高,现在要去学习不一般的东西,学习更深层次更本质的东西。
    2019-11-27
    9
  • Mr_Liu
    果然,老师这个加餐很及时,回过头来再听,感觉又不一样的感觉,‘’懂‘’问题和,懂问题是两个情况。书读百遍其义自见,但方向错了千遍也是一个理解
    2019-11-27
    5
  • Amundsen
    老师的加餐文章讲解的十分到位了,教者有其法,学者有其道。
    2019-12-03
  • 行问
    如果每门课程都是一样的,那我是绝对不会来学习这门课程的,简单明了说了:JavaScript 核心原理解析

    感觉现在的前端新手,被市面上的观念带偏了,认为前端就是什么 3 大框架:Vue React Angular

    在操作 DOM 方面,我仍然认为 jQuery 是这个世界上最伟大的库,没有之一。如果真的能够把 jQuery 的源码全部读懂,我相信在国内已经甩开 80% 90% 的前端从业人员了。

    基础打扎实了,那么学习应用层的就能大大减少时间,更快上手......

    回到老师的课程,我就是喜欢看到不一样,看到核心的东西,李小龙也是从小开始从马步、跑步开始的,这就是腰腿的力量,扯远了。
    2019-12-03
收起评论
4
12
返回
顶部