JavaScript 的诞生

136 阅读6分钟

JavaScript 的诞生

JavaScript简介

概述

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。

  • 包含以下三个组成部分。
    ECMAScript:由 ECMA-262 定义并提供核心功能。
    文档对象模型(DOM):提供与网页内容交互的方法和接口。
    浏览器对象模型(BOM):提供与浏览器交互的方法和接口。

JavaScript 的这三个部分得到了五大 Web 浏览器(IE、Firefox、Chrome、Safari 和 Opera)不同程度 的支持。所有浏览器基本上对 ES5(ECMAScript 5)提供了完善的支持,而对 ES6(ECMAScript 6)和 ES7(ECMAScript 7)的支持度也在不断提升。这些浏览器对 DOM 的支持各不相同,但对 Level 3 的支 持日益趋于规范。HTML5 中收录的 BOM 会因浏览器而异,不过开发者仍然可以假定存在很大一部分公共特性。

历史

Javascript 作为 (网景公司) Navigator 浏览器的一部分首次出现 在 1996 年。它最初的设计目标是改善网页的用户体验。作者是 Brendan Eich。期初 javascript 被命名为 Livescript,后因和 Sun 公司合作,因市场宣传需要改名 javascript。后来 Sun 公司被 Oracle 收购,javascripth 版权归 Oracle 所有。

发展期

  • 微软的懈怠

由于IE6的巨大成功,微软觉得再花费精力不值得,而且没有竞争对手,所以直接解散了IE6开发团队

Firefox的出现让微软重新组建IE团队,但不是同一队人,造成IE7、8问题不断

  • 谷歌抓住机会

2004年,谷歌雇佣了一些Firefox和IE的开发者

2008年,Chrome发布,迅速拿下1%份额

2011年,Chrome份额超过Firefox

2016年,Chrome全球份额62%

  • 移动市场的兴起

2010年,iphone4发布

移动市场的兴起,让前端摆脱被IE支配10年的恐惧,从此前端急速发展

  • ECMAScript标准的制定

1997年6月,第一版ECMAScript发布

1999年12月,第三版发布,这个版本使用最广

第四版,流产

2009年,第五版发布,增加了一些功能

2015年6月,第六版发布,新浏览器都支持这一版本

之后每年发布一版,版本号以年份命名

  • JavaScript兴起
    杀手级应用Gmail

2004年愚人节,谷歌发布Gmail在线网页

2005年,Jesse讲谷歌用到的技术命名为AJAX,从此前端正式出现

2006年,jQuery发布,是目前最长寿命的JS库

后来10年,jQuery大放异彩,直到IE不行了,jQuery才稍微没那么火

JavaScript的设计缺陷

  1. 设计阶段过于仓促。这种语言的设计初衷,是为了解决一些简单的网页互动(比如,检查"用户名"是否填写),并没有考虑复杂应用的需要。设计者做梦也想不到,Javascript将来可以写出像Gmail这种极其庞大复杂的网页。
  2. 没有先例。Javascript是世界上唯一使用Prototype继承模型的主要语言。这使得它没有设计先例可以参考。
  3. 过早的标准化。Javascript推出一年半之后,国际标准就问世了。设计缺陷还没有充分暴露就成了标准。

JavaScript的10个设计缺陷

1. 不适合开发大型程序
Javascript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。
2. 非常小的标准库
Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
3. null和undefined
null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。两者非常容易混淆,但是含义完全不同。在实践中,null几乎没用,根本不应该设计它。
4. 全局变量难以控制
Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。
5. 自动插入行尾分号
Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
6. 加号运算符 +号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。

alert(1+10); // 11
    
alert("1"+"10"); // 110

如果一个操作项是字符,另一个操作项是数字,则数字自动转化为字符。

alert(1+"10"); // 110

alert("10"+1); // 101

这样的设计,不必要地加剧了运算的复杂性,完全可以另行设置一个字符连接的运算符。
7. NaN NaN是一种数字,表示超出了解释器的极限,他有一些很奇怪的特性

NaN === NaN; //false

NaN !== NaN; //true

alert( 1 + NaN ); // NaN

与其设计NaN,不如解释器直接报错,反而有利于简化程序。
8. 数组和对象的区分 由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。 9. == 和 === ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。

"" == "0" // false

0 == "" // true

0 == "0" // true

false == "false" // false

false == "0" // true

false == undefined // false

false == null // false

null == undefined // true

" \t\r\n" == 0 // true

因此,推荐任何时候都使用"==="(精确判断)比较符。
10. 基本类型的包装对象

new Boolean(false);

new Number(1234);

new String("Hello World");

与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。

alert( typeof 1234); // number

alert( typeof new Number(1234)); // object