w3ctech

【观点】如何学好JavaScript?(第一期@月影)

学习JavaScript的第一要点,心里要明白“是什么”

“42!” 卢恩克沃尔嚷道,“难道这就是你经过750万年的运算后展示给我们的结果吗?”

“我非常细致地检查过了”,电脑说,“这确实就是那个答案。我认为问题出在——老实说吧——你们从来也没有确切地知道这些问题本身到底是什么。”

—— 《银河系漫游指南》

提升JavaScript技能,几乎是每位希望从事和已经在从事前端行业的同学的愿望。尤其在当前这个H5的时代,JavaScript作为前端最核心的技能,占据着非常重要的位置,几乎所有的前端相关的领域都离不开JavaScript。

很多同学在下苦工学习JavaScript,有的进步飞快,也有的停滞不前,还有的当前遇到瓶颈,正在寻找突破方法。

学习JavaScript也有很多种方法,比如系统地学习教程,不少同学读过和正在读《JavaScript 权威指南》《JavaScript 高级程序设计》。比如通过互联网和在线教育平台来学习,有的同学通过查找资料,收看在线视频等方式来学习。比如通过代码来学习,有的同学通过阅读github上的一些优秀项目的代码来提高自己。另外还有彻头彻尾的实战派——有的同学工作中遇到问题再去找答案。

经常有一些能力比较强的同学会对一些新同学说:

你的学习方法不好,基础不够扎实,还是该好好阅读基础的书,借你一本书《xxxxxx》好好看看

别人这段代码写得不好,不要模仿它,你应该要这样这样写……

千万别去看培训,没用的,自己多写点代码,慢慢就会了……

以上这些说法既对也不对,说他们对,是因为JavaScript的基础确实很重要,而前端的特点又导致JavaScript“易用难精”。简单点说,一个什么都不懂的人,从别人网站上copy一段代码到自己的网页里,基本上就可以用了,使用门槛几乎为0,而jQuery的流行,也确实使得JavaScript操作DOM更加容易上手,几乎一行代码就能马上看到效果。

JavaScript这样的特点,就会导致很多人但求用JavaScript解决各种问题,而修炼基础不够扎实,这就好比只学习招式,而没有内力搭配,虽然看来进步快速,但是最终是无法发挥这门语言的全部功力的。

但是,不同的学习方式,能不能学好JavaScript?答案是多半是可以的,只是优劣、境界和快慢会有所差别,成效也是因人而异的,方法对事有好的和不好的,对人有合适的和不合适的,因此说,上面的讲法也是对的,按照有些方法来学习,进步会比别的方法要快一些。

月影认为,要掌握到JavaScript最精华的内容,就要从基础开始修炼,而掌握基础的要点,就是首先弄明白要学习的东西是究竟什么

道与术

是规律,真理和本质,而是实战,手段和方法。

通常任何一本教程,最终目的是让你会运用,也就是说,它的目的是达到传授“术”,虽然说好的教材,也会有成体系的“道” 贯穿于始终,但是“道”总是要自己去领悟的。

因为要讲实战,以“术”为主,所以不同层次的内容就会混合在一起,混在一起学习,本没有什么问题,但是要搞清楚本质一点的东西,就需要有自己梳理内容层次的能力,层次分明了,就明白所学习的究竟是什么东西,这样也就接近了“道”。

一般的JavaScript教程中讲授的内容其实包括几个层次的概念:

  • 编程思想

    编程思想 就是指程序员遇到实际问题时将其表达为程序模型从而实现需求的方法。编程思想是程序员思考问题的思路,它既包括共性的内容,对所有程序员都适用的,比如算法,也包括特定语言的思想。所有的教程中,只要涉及到真正的实战代码,其中都包含着编程思想,除非那个代码是猴子写的。

  • 编程语言

    编程语言 是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。狭义来说编程语言就是人(程序员)写给计算机的语言。但是如果从这个层面上定义的话,那代码的好坏之分,就只有从正确性、运行效率等少数几个机械层面来衡量了,也就是说不论代码写得多么晦涩,只要能解决问题,在可以接受的时间内解决问题,那就是好的代码。但是,实际上,问题并没有那么简单,在大部分高级语言里,编程语言不仅仅意味着人写给机器的代码,还意味着人写给人的代码。JavaScript也好、Java也好、Python也好,学习语言本身,最大的精力还是应该放在人与人这一头,这样也就产生了第三个概念编程风格

  • 编程风格

    一段C++代码和一段JavaScript代码,稍微了解一点点基础知识的同学就能很轻松分辨出来,然而,一段用C++风格写出来的JavaScript代码这就不是一个经验浅的程序员所能够分辨的了。我们说编程风格指的是编写代码的样式规则和约定,它因人而异、因团队而异,也因语言特征而异。每一种语言有其特殊的特征,因此会产生出一种或多种配合它的编程风格,使用这样的风格,不说是完全好,但是会比其他风格更有效率。不过风格这个东西,不是一句两句代码可以说得清楚的,必须在实践中慢慢体会。

  • 运行环境

    月影之前学C语言的时候,最大的困扰不是C语言中难学的指针等概念,而是C语言学习完之后能干什么。实在是看着一整本书在那黑黑的控制台上玩各种字符输出很无奈有木有!难道说学习了C语言,仅仅用来输出各种字符?那学它干嘛?

    也许现在看来这种困惑很傻,但是会造成这样的困惑,一方面是因为教程没能说明C语言的用途,另一方面是因为当时在月影的头脑里是还分不清语言本身和运行环境的概念区别的,错误地认为了C语言=C语言+运行环境。

    学习JavaScript有一点好,那就是JavaScript在浏览器上可以直接看到效果,至少不会出现月影当年学习C语言学完了不知道用在哪里的这种惨剧。但是也依然要分清楚,JavaScript(或者ECMAScript)语言本身仅仅是图灵完备的编程语言,它的基本语法、语义、语言结构是语言范畴的概念,DOM、BOM等概念是运行环境相关的。DOM操作从本质上来讲是以JavaScript的语法来操作浏览器提供的API。从这一点来说,jQuery等框架本质上都是语法糖(但是jQuery等框架又超越语法糖,这一点以后的学习中会解释其中的原因)。

  • 开发工具

    对于JavaScript这种能用记事本写的,开发工具并不是最重要的,但是好的开发工具能大大提升开发效率。而对于前端程序员来说,JavaScript并不特别依赖于很重的集成开发环境,通常我们给新人推荐Sublime text这样的简单编辑器。除了编辑器之外,广义的开发工具还包括集成环境和代码编译工具,这些内容和工程学相关,后面有机会我们可以详细探讨。

总结

以上随便八了一点学习和提高JavaScript的想法,不涉及具体代码的部分,其中一些内容是月影多年学习的体会和个人想法,不一定正确,如果有同学能从中得到收获那固然好,如果觉得有问题或者疑问,也不妨直接提出来咱们讨论。有一点切记切记,好的学生第一条原则便是独立思考,切勿盲目追随迷信,如果月影夸口说自己所言皆是金科玉律,那么月影便不是好老师,前端之道甚深,很多问题只能共同参研,至于领悟多少则如人饮水冷暖自知,你不代表月影,月影也无法代表你。

最后,提升功力的不二法门自然唯有勤写代码,如果大家有兴趣,不妨咱们约个周末,找个安静清幽的环境,带上自己的电脑,与月影一起写一写,这样更容易体会心境和妙味,亦有助于个人之提升,大家觉得如何?


今天先谈到这里,这是一个系列的第一篇,后续月影将和大家逐步聊聊以下内容:

  • JavaScript究竟是什么样的语言?
  • 月影自己在学习JavaScript的过程遇到了什么问题?
  • 为什么有人能把代码写得又少功能又强大?
  • jQuery的write less,do more真的只是一句口号吗?如果不是,它是怎么做到的?
  • 如果找工作的时候别人考你一道牛逼的JS面试题时你该怎么办?(一种是你会,一种是你不会)
  • 什么样的学习方式【可能】对你有用?
w3ctech微信

扫码关注w3ctech微信公众号

共收到14条回复

  • 以后看一个人的js写的好不好,看看是不是用的c++风格写的

    回复此楼
  • 谢谢分享,待续!

    回复此楼
  • 写得挺好,不过叔叔,我们不约

    回复此楼
  • 有些道理讲的很好,要推荐给新入职的同学看下。【不过月影为什么说不好的代码是“猴子”写的呢?(^__^) 】

    回复此楼
  • 回复此楼
  • 分享我自己的切身经历,我是干java的,在传统的软件公司写网页多一点偏网页, 从11年写到14年,我写了3年的jquery网页, 一直用jquery1.2的api, 原生js的API查一些es3.chm的古老文档,然后14年中旬出去面试,发现自己low的不行,也不是不能干活,jquery插件也能写,ui也能搭的有模样,流行的js库也能拿来随意使用,但是自己一直对js的基础不求甚解,( prototype, 闭包,css hack, 深copy, 浅copy, 事件冒泡,js继承的十几种写法等等等等,更别提自动化,css预处理等等了 )导致了14年惨痛的面试打脸, 开始还有点不服气, 这有啥的,我能干活就行呗,后来发现自己真的不能干活,自己认为自己能干活是因为公司的要求太低了。

    没有什么比基础更重要。十年磨一剑,欲速则不达,github的台上光鲜, 台下10年功的积累

    回复此楼
  • 不知道可不可以,月影前辈分享一点js的堆栈相关知识,发现一般书中介绍此类知识很少,比如js的堆栈和其它语言的堆栈一样吗,js的堆里存什么样的数据,栈里存什么数据,栈的数据如何共享,内存图和其他语言一样吗,也不怕笑话了,我基础很烂,希望月影前辈指点哈,

    回复此楼
  • 感同身受 “”月影之前学C语言的时候,最大的困扰不是C语言中难学的指针等概念,而是C语言学习完之后能干什么。实在是看着一整本书在那黑黑的控制台上玩各种字符输出很无奈有木有!难道说学习了C语言,仅仅用来输出各种字符?那学它干嘛?

    回复此楼
  • 简单回答一下关于堆栈的问题,因为JavaScript是动态脚本语言,严格来说它目前主要的运行环境中是没有直接的物理堆栈操作的,对内存的访问是交给底层引擎来做的,所以一般来说js编程的时候不需要考虑直接的堆栈操作。现代语言里面把对机器的物理操作封装于引擎和runtime底层,让程序员将主要精力更专注于业务,这是一种设计理念。如果深入到js引擎,比如v8、或者JavaScriptCore,那么你就会发现引擎中关于这部分底层内容依然是用C++等更底层一些的编程语言来实现的。

    回复此楼
  • 感同身受 “”月影之前学C语言的时候,最大的困扰不是C语言中难学的指针等概念,而是C语言学习完之后能干什么。实在是看着一整本书在那黑黑的控制台上玩各种字符输出很无奈有木有!难道说学习了C语言,仅仅用来输出各种字符?那学它干嘛?

    回复此楼
  • 有一点和月MM是一样的:学了C语言后,不知道怎么把它和网站啊、游戏啊之类的挂上钩。。。所以后来我去学了flash + as2 ,做些好玩,又看得见效果的动画、游戏之类的,比如这个07年初做的小玩意儿 http://www.adanghome.com/flash_demo/dog_race.swf ,尽管满是bug,却让我有极大的成就感。所以在刚工作的头几年,问我如何编程入门的同学,我都推荐他们去玩flash。

    只是,月MM,你这文章写了这么长,好像说了些什么,可是再一琢磨,却好像什么也没讲。。。

    回复此楼
  • 这篇文章的确没说什么具体的技术内容,只是把心境做了一些比喻,因为有些内容无法用具体的语言描述,只能心有所感的体悟。 另外就是思想、语言、风格、环境、工具这几个层次的归纳。 总之这不是一篇技术教程,只是谈谈思考和境界。 阿当你应该自身已经越过这个境界了,并且你所学和我又不是同一路数的,所以有这个感觉也是很正常滴。 从某种层面上来说,我,的确是什么也没讲 :P

    回复此楼
  • 写得很好,赞一个

    回复此楼
  • node js。 canvas。 Html5。css3。 jquery。好多关于前端的学习课程, 想交流加我扣扣2079576908 前端课程http://www.icketang.com/?tg

    回复此楼