怎样扎实自己的 JavaScript 基础?

共 3355字,需浏览 7分钟

 ·

2022-02-09 09:04

实名反对 @小爝 回答中的观点。(题外话:这是我在知乎上第一次实名反对别人的观点,更是第一次实名反对一个大V的观点。大家应该都清楚在知乎上反对大V的观点风险是很高的,尤其像我这种还在办培训班的,甚至有可能影响我的招生。我更不是因为想要自己的回答排到他的前面才要反对他的观点,我的回答赞数比他高,但排在他后面,当然是由于一些人因为我在办培训所以故意点了反对。我也并不是很在意回答的排名。我只是觉得他的观点有待讨论,还请爝神见谅~)

爝神的其它观点我都认同,但他在回答中提到了如下观点:

……他属于一种胶水语言,是依赖于某个宿主环境下的…… 所以学javascript的基础说白了就是学好ECMAScript,他是javascript的标准。定义了javascript中的流程控制,数据结构,操作符,各种标准对象,表达式,函数,原型等。

小爝认为,由于JS是胶水语言,也是脚本语言,它的能力完全取绝于宿主环境给它提供的API,所以学好JS不是要学宿主环境提供的API,而是要学JS语言本身。

考虑到上面所列出的JS中的非常基础的东西真正学起来其实花不了多长时间,我暂且认为爝神所说的学习ECMAScript就是去读一读标准好了。

如果完全从题目的的描述来看,题主确实只问了如何扎实自己的【JavaScript】基础,小爵也说了,标准中定义了语言的流程控制,数据结构等这些内容,宿主环境都不能算是JS,只能算是API。我不否认学好这些当然很重要,但如果觉得只是学好这些就算是JS基础扎实了,我觉得是远远不够的。标准确实详细的定义了JS,但也仅仅只是定义了JS。事实上,标准甚至对timer,事件,事件循环,OOP,函数式/高阶函数等等这些事物和概念都只字未提,更不会提起这些特性具体应该用在什么场景下了(我是在这个版本的标准中进行了全文搜索ecma-international.org/才发现标准中原来并没有讲到这些,以往查标准也都只是看一小部分,并没有注意到这些)(当然,也确实不应该提,因为标准只描述JS,不描述宿主提供给JS的环境),全文都是在讲这个语言无穷的细节,讲某个函数具体到步骤应该如何实现,讲遇到各种情况时引擎应该如何应对,但标准实际上更多应该是给语言的实现者看而不是给语言的使用者看的。对于一个语言了解到足够深后去看标准当然是件好事,但这属于最后的拔高了。

虽然标准没有指明宿主应该如何,但主流的JS实现中,所有的宿主几乎都给JS提供了事件循环机制,单线程的运行(不考虑出现不久的Worker)和各种异步函数,而这些主流环境(浏览器、Node)提供给JS的这些API(Buffer,Node,Event等)基本可以算是JS标准库的一部分了啊,而实际上的情况是离了这些JS才真叫一个啥都干不了,所以我觉得想要扎实自己的JS基础不去把这些内容弄清楚而是去看标准中对语言细节的无穷描述,对于新手来说,不仅花费时间,而且还会把自己弄的一头雾水。

而我觉得题主之所以能够提出这样问题,十有八九他就是从JS语言开始入门编程的(因为我觉得一个人如果能够想到去看标准或者能够有能力看懂标准,那他肯定不会提出这个问题了),JS中所具有的在各种语言中也有的、由主流宿主环境提供的编程范式(OOP,事件循环等),才应该是一个新手需要去深入了解的。

况且无论是权威指南还是高程,都不只讲了JS的语法等等仅语言级别的东西,而是还附带了大量的篇幅讲解其在宿主环境中的表现和使用。

以上仅为一家之言,本着谦虚谨慎的态度与各位大神讨论,如有疏漏还望各位留言指正。

====以下为原回答====

我是不赞同把各种语言都学一遍的,首先你就没那个时间,而如果在时间有限的情况下还去学那么多种语言,那每种就只能浅尝则止了,必然也就体会不到每种语言的精髓所在了,最多学习个语法,只能说聊胜于无,而且很快会忘。

具体到JS,想要扎实,那当然是要学习和理解它的精髓了。

我要说JS也有精髓,可能有人又要开骂了。

那我这么说吧,JS这门语言兼具面向对象,函数式,过程式,事件驱动,异步编程等各种编程范式。事实上这个组合已经超过不少编程语言了。如果算上Worker,那它还算是支持多线程,再加上Promise,嗯,可以说这算是一种新的异步编程范式吧,主要这东西还是JS社区发明的。(更新:经人提醒,Promise并不是JS社区发明的,抱歉)

所谓理解它的精髓,当然就是理解上面这些内容的的精髓了,再进一步说,就是在JS里如何使用,甚至是如何实现以上所说的这些编程范式,以及这些范式如何为业务服务

下面来一个个来说:

过程式,这个就不说了,学习任何语言几乎都是从过程式开始的,当然也就是如何用各种语句来表壳程序逻辑了,这方面需要多做做算法题,刷LeetCode或者CodeWars都是不错的选择。说一个过程式里可能容易忽略的,就是递归,需要深入理解并且习惯于使用和阅读用递归实现的代码。

面向对象,对于这个说好说坏的都有,但几乎所有的现代编程语言都支持它,所以你也必须了解。首先是了解面向对象的内涵,比如封装,继承,多态到底都是什么,然后是在JS里如何实现它,原来需要原型,所以你要搞清楚原型链,现在ES6里有class语法糖了,使用起来会方便很多,又需要你掌握ES6里的写法。同时,这一块还会涉及到this的几种情况等,也是必需要掌握的。

函数式,不得不说函数式编程范式在这些年里简直大放异彩,20年前发明的JS竟然也赶上了这趟车,函数式编程对于初学者来说并不是很好理解,而且学习也需要专门的资料。不过它在JS里的体现最主要就是高阶函数了,比较具体的体现就是数组对象上面的map/reduce等一系列高阶方法,当然,当会用可能还不够,你还得自己能够实现这些高阶函数,同时在前端尤其是UI里面,如果灵活使用高阶函数,也会让代码很容易维护。

接下来,事件驱动。理解这个可能很容易,就是onclick咯。但是这里光是知道这个肯定是不够的,因为事件驱动就涉及到JS的事件循环机制了,这一块也是JS的重点,这里就不展开了。

然后,异步编程,注意,这里我特意把事件驱动与异步编程分开来讲,因为它们确实是不一样的。非要说相似之处,那就是事件驱动其实就是会多次发生的异步任务,可能不太准确,但大体就这么回事。由于JS本身是单线程的,所以想要用它来响应用户的行为就得用异步了,响应用户的另一种模式是使用同步加多线程和锁,这就又涉及到另一个话题了,具体我就不多说,点到为止,总之异步也是JS里非常重要的一个点。


所以如果你能把这几大块都弄懂,那么在我看来,可以算是JS基础比较扎实了。

最后,有没有什么简单的任务或者书本能够直接锻炼以及讲到到上面这些内容呢?

答案是有的,JS有一个库叫Lodash,里面有上百个函数,基本涉及到了我上面说到的绝大多数内容:编程基础,高阶函数,面向对象,异步等。如果能够把它八成以上的函数都独立实现一遍,JS基础肯定会有极大的进步。

我对学生就是这个要求,所有的学生都要求实现Lodash里的高频函数。有一个学生,把Lodash实现了三遍,后来跟我说,实现Lodash的那些天,每天晚上都能够明显感觉到自己的编程水平在增加,就像健完身肌肉恢复后的那种感觉一样。后来他去了美团(wai)(mai)。

至于书本的话,其实大多数的书都会讲到我上面说到的这些部分,但对于初学者,我不建议上来就读《JS权威指南》或者《JS高级程序设计》(即犀牛书与红包书)。

我比较推荐的一本是《Eloquent JavaScript》,这是一本面向初学者的介绍用JS完成现代编程的书,对于JS语言的介绍也相当全面,并不比其它的书少,更主要的,它还在书中扩展的讲到了很多编程中会遇到的问题,其它讲JS的书都没怎么讲到

我上课就是使用的这本书的英文原版做为参考书的,为了让学生能看,我基本上把全书标注了一遍,如果你想看我标的版本,可以到这篇专栏分享:为《Eloquent JavaScript》全书做了中文标注和内容注解,附 PDF 下载文章里看一下我对这本书更详细的评价,文章末尾也留有下载链接。

啥,“我的学生”?你是老师?你也是办培训的?对,我是办前端培训的,求别喷。

浏览 5
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报