JavaScript 历史及缺陷

72 阅读6分钟

诞生

  • 发明时间:1995
  • 发明人:网景的布莱登 (Brendan Eich)
  • ECMAScript 是javaScript的纸面标准,而JavaScript是ECMAScript的现实实现。

1994年,网景发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。所以网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。布莱登用十多天写完了js,它在网景导航者浏览器上首次设计实现而成,然而开发时间过短,埋下了很多隐患。

发展

浏览器大战:

在95年前后,很多公司都推出了自己的浏览器,但真正起到重要影响作用的是96年8月,微软发布了自己的浏览器:IE3。IE3使用的脚本语言是JScript,在抢占浏览器市场份额时,每家浏览器使用的脚本语言都有点不一样。当时为了对抗微软,网景联合一些小公司想要制定脚本语言的规则,于是向ECMA提交了一份语言标准,由于版权问题,该标准不能叫JavaScript,于是叫做ECMAScript。

微软在当时为了让IE能够在一众浏览器中脱颖而出,将IE捆绑进Windows,于是网景在浏览器大战中节节败退,最后在1998年,网景决定背水一战,将自己的产品开源。网景抱着必死的决心,哪怕我的公司倒了,我的浏览器也要一直流传下来。但是网景也没有因为开源而重新获得用户的青睐。

网景死后,IE失去了竞争对手,再也没人能阻碍其发展。2001年,微软同时发布了IE6和Windows XP,IE6迅速横扫市场,在2004年,占据了全球市场的80%。甚至膨胀到解散了IE6的团队,因为这款浏览器已经不需要继续开发了,只要留一个人做日常维护就行了。然而IE6有很多令人诟病的地方,一是这款浏览器不兼容W3C标准,这也让很多前端开发者对其恨得牙痒痒,每次做一个页面,必须再做一款适配IE的版本。并且IE6不断的爆出安全漏洞。FireFox看准了IE6的一系列问题,想要卷土重来,重新夺回江山,然而即使IE6存在着这么多的问题,FireFox也只抢回来10%左右的市场份额。微软面对FireFox的卷土重来,也作出了应对,重新组建了一支做浏览器的团队,在2005年发布了IE7,但是连IE7都干不过IE6,直到2006年,市面上的主流浏览器还是IE6和FireFox,甚至在中国,IE6一直坚挺到了2010年。

面对微软的懈怠,谷歌抓住了机会,在2004年,谷歌雇佣了一些原来FireFox团队中的人和原来IE6开发组里的人,花了四年时间研制了一款浏览器。2008年,属于谷歌的浏览器Chrome正式发布,在发布这年就迅速拿下了1%的市场份额。2011年,Chrome超过FireFox。2016年Chrome全球份额达到62%。但即使Chrome抢占了IE的绝大部分市场,也不至于真正的杀死IE将其赶出历史的舞台,IE真正走向迟暮是从移动市场开始。

2010年,苹果发布了第一款智能手机iphone4,标志着智能手机开始崛起,2011年微软和诺基亚合作,也想进军智能手机市场,但是结果大家都知道,诺基亚的手机业务完了,这也表示手机上基本没有IE了。2016年,淘宝天猫宣布不再支持IE6、IE7,同年年底,不再支持IE8。中国的前端都没想到移动市场的兴起能让他们摆脱恐怖支配了他们10年的IE。从此,中国的前端极速发展。

JavaScript的爆发:Chrome的JS引擎叫做V8,2009年Ryan基于V8创建了Node.js,2010年,Isaac基于Node.js写出了npm,从此前端程序员可以在浏览器之外执行JS了,于是Node.js快速风靡。同年TJ受Sinatra启发,发布了Express.js。从此前端程序员也可以写后端应用了。这之后,又爆发出很多技术,有些一直沿用至今,比如webpack、react、vue等。

标准发布

1997年6月,第一版ECMAScript发布。

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

第四版流产,因为在IE的统治下,标准制定者发现即使制定了标准都没人用。

2009年12月,第五版发布。终于在长达十年之后,随着FireFox和Chrome的崛起,ES终于迎来了再一次的更新。

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

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

JavaScript的设计缺陷

  1. 不适合开发大型程序

  2. 标准库函数很小,功能响相对局限

  3. null和undefined的易混淆:null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。

  4. 全局变量难以控制:Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。所以let的出现就改善了这一点

  5. 自动插入行尾分号

  6. 加号运算符可以表运算也可以表连接 7.NaN:表示超出了解释器的极限,没必要,没必要,不如直接报错 8.数组与对象的区分:因为数组也属于对象,所以区分不方便

    if ( arr &&typeof arr === 'object' &&typeof arr.length === 'number' &&!arr.propertyIsEnumerable('length')){ alert("arr is an array"); } 9.==/===

    "" == "0" // false 0 == "" // true 0 == "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.基本类型的包装对象 Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。