【JS全解】JS历史

105 阅读5分钟

JS的学习要求

  • 当出现BUG,先质疑自己,而不是质疑计算机。
  • 程序员应有的软能力:逻辑能力、质疑自我、抽象思维。
  • 程序员应有的硬能力:足够多的代码、足够多的概念、足够多的踩坑。
  • 如何统计代码行?
    • 安装cloc:yarn global add cloc
    • 把node_modules等不相关目录写入.gitignore文件中。
    • 进入git仓库,运行cloc --vcs=git .

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个设计缺陷
    1. **不适合开发大型程序。**JS没有名称空间、没有如何将代码分布在多个文件的规范、允许同名函数的重复定义,这些都不利于模块化。
    2. 非常小的标准库。标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
    3. **null和undefined。**两者同时存在,非常容易混淆,而前者在实践过程中几乎没用。
    4. **全局变量难以控制。**JS中的全局变量在所有模块都可见,而任何一个函数内部都可以生成全局变量,这极大加剧了程序的复杂性。
    5. **自动插入行尾分号。**自动在行末加分号的机制在某些情况下会导致BUG。
    6. 加号运算符。+号在JS中同时表示数字的和以及字符串的连接,这样的设计不必要的增加了运算的复杂性。
    7. **NaN。**NaN有一些很奇怪的特性。
      NaN === NaN; //false
      NaN !== NaN; //true
      alert( 1 + NaN ); // NaN
      
    8. **数组和对象的区分。**JS的数组也属于object,所以要区分一个对象到底是不是数组,相当麻烦。
    9. ==和===。==用来判断两个值是否相等,当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。推荐任何时候都使用"==="比较符。
    10. **基本类型的包装对象。**JS的三种基本数据类型:字符串、数字和布尔值,很容易与object类型混淆。