JS的学习要求
- 当出现BUG,先质疑自己,而不是质疑计算机。
- 程序员应有的软能力:逻辑能力、质疑自我、抽象思维。
- 程序员应有的硬能力:足够多的代码、足够多的概念、足够多的踩坑。
- 如何统计代码行?
- 安装cloc:
yarn global add cloc。 - 把node_modules等不相关目录写入.gitignore文件中。
- 进入git仓库,运行
cloc --vcs=git .。
- 安装cloc:
JS前瞻
- Brendan Eich:1995年开发了JavaScript。
- ECMAScript版本
- 第三版:使用最广。
- 第六版:新浏览器都支持。
- JavaScript与ECMAScript的关系
- ECMAScript是纸上的标准,JavaScript是浏览器的实现。
- 纸上标准往往是落后于浏览器的。
JS的诞生
- 1994年,网景公司发布了Navigator浏览器0.9版,为了使它有与访问者互动的能力,网景公司急需一种网页脚本语言。
- 1995年,Sun公司将Oak语言改名为Java,正式向市场推出。网景公司决定与Sun公司结成联盟,Sun公司完全介入网景公司的网页脚本语言决策。
- 1995年4月,网景公司录用了Brendan Eich,原本招聘他的目的是研究将Scheme语言作为网页脚本语言的可能性。
- 1995年5月,网景公司指定Brendan作为一门“简化版Java语言”的设计师,这种语言必须“看上去与Java足够相似”,但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上把Scheme等一众非面向对象编程的语言排除在外了。由于Brendan对Java一点兴趣都没有,只是为了应付公司的任务,他用10天就把JavaScript设计出来了。也正是因此,JS中的一些细节考虑的不够严谨,导致后来很长一段时间,JS写出的程序混乱不堪。
- 多年以后,Brendan Eich还是看不起Java。他说:
"Java(对Javascript)的影响,主要是把数据分成基本类型(primitive)和对象类型(object)两种,比如字符串和字符串对象,以及引入了Y2K问题。这真是不幸啊。"
JS的发展历史
- 1995年,加入网景的Brendan Eich应公司要求,为其浏览器开发了JS功能。
- 1996年,为了应对微软的JScript语言,网景向ECMA提交语言标准,ECMAScript诞生了。
- 1997年,第一版ECMAScript发布。
- 1999年,第三版ECMAScript发布,是目前使用最广的版本。
- 2004年,谷歌基于JS发布了Gmail在线网页。
- 2005年,Jesse将谷歌用到的技术命名为Ajax,从此前端技术正式出现。
- 2006年,jQuery发布,成为之后最长寿的JS库。
- 2009年,Ryan基于V8创建了Node.js。
- 2010年,Isaac基于Node.js创建了npm,从此前端工程师能在浏览器之外执行JS了。同年,TJ发布了Express.js,从此前端工程师能写后端应用了。
- 2015年,第六版ECMAScript发布,新的浏览器都支持这一版本。
JS的缺陷
- 缺陷出现的原因
- **设计阶段过于仓促。**JS的设计只用了10天,甚至其设计师本人也只是为了向公司交差,根本没有想到JS未来可以写出Gmail这样及其庞大复杂的网页。
- **没有先例。**JS同时结合了函数式编程和面向对象编程的特点,这很可能是历史上的第一例。
- **过早的标准化。**JS的发展非常快,根本没有时间调整设计,这让它的规格还没来得及调整,就固化了。相比之下,C语言问世将近20年之后,国际标准才颁布。
- JS的10个设计缺陷
- **不适合开发大型程序。**JS没有名称空间、没有如何将代码分布在多个文件的规范、允许同名函数的重复定义,这些都不利于模块化。
- 非常小的标准库。标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
- **null和undefined。**两者同时存在,非常容易混淆,而前者在实践过程中几乎没用。
- **全局变量难以控制。**JS中的全局变量在所有模块都可见,而任何一个函数内部都可以生成全局变量,这极大加剧了程序的复杂性。
- **自动插入行尾分号。**自动在行末加分号的机制在某些情况下会导致BUG。
- 加号运算符。
+号在JS中同时表示数字的和以及字符串的连接,这样的设计不必要的增加了运算的复杂性。 - **NaN。**NaN有一些很奇怪的特性。
NaN === NaN; //false NaN !== NaN; //true alert( 1 + NaN ); // NaN - **数组和对象的区分。**JS的数组也属于object,所以要区分一个对象到底是不是数组,相当麻烦。
- ==和===。==用来判断两个值是否相等,当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。推荐任何时候都使用"==="比较符。
- **基本类型的包装对象。**JS的三种基本数据类型:字符串、数字和布尔值,很容易与object类型混淆。