1994年,在互联网刚兴起的时代,网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。因此网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。
网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。
1995年,Sun公司将Oak语言更名为Java并推向市场,并宣称“Write Once, Run Anywhere”。网景公司深受Java的影响,网景公司高层都非常信赖Java,所以网景公司决定要蹭Java的流量,新开发一门语言,用于浏览器的交互。
JavaScript诞生1995年4月,BrendanEich(布兰登·艾奇) 加入网景公司。Brenden原本研究方向是函数式编程与Scheme语言。但是1995年5月,网景公司指定Brenden成为了“新语言”的设计师。并且要求这个“新语言”要和Java足够的相似(面向对象思想),但是要比Java能够更加简单地上手。
Brenden志不在此,而且对Java完全不感兴趣,为了完成任务他花了10天时间便把这门“新语言”的最初版本设计了出来。总的来说他的设计思路是这样的:
(1)借鉴C语言的基本语法;
(2)借鉴Java语言的数据类型和内存管理;
(3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
(4)借鉴Self语言,使用基于原型(prototype)的继承机制。
所以,Javascript语言实际上是两种语言风格的混合产物——(简化的)函数式编程 (简化的)面向对象编程。
JavaScript名字的由来最初为了紧贴Java(有一种咖啡也叫Java),这门“新语言”被命名为Mocha(有一种咖啡也叫Mocha)。
但由于商标的问题,以及网景公司很多产品已经使用了“Live”作为产品名前缀,Mocha更名为LiveScript。
由于网景公司与Sun公司有一些合作(网景公司允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页),Sun把Java这个商标授权给了网景公司,于是LiveScript更名为JavaScript。
JavaScript的10个缺陷JavaScript被Brenden仅仅花了10天就开发了出来,可想而知JavaScript是如此的粗糙。但这并不影响他在未来成为最热门的编程语言之一。就好比某名人说的”站在风口上猪都能飞起来”。而JS就是21世纪前端的天之骄子。
1.不适合开发大型程序
Javascript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。
2.非常小的标准库
Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
3.null和undefined
null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。
typeof null; // object
typeof undefined; // undefined
两者非常容易混淆,但是含义完全不同。
var foo;
alert(foo == null); // true
alert(foo == undefined); // true
alert(foo === null); // false
alert(foo === undefined); // true
在编程实践中,null几乎没用,根本不应该设计它。
4.全局变量难以控制
Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。
a = 1;
(function(){
b=2;
alert(a);
})(); // 1
alert(b); //2
5.自动插入行尾分号
Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
比如,下面这个函数根本无法达到预期的结果,返回值不是一个对象,而是undefined。
function(){
return
{
i=1
};
}
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),所以要区分一个对象到底是不是数组,相当麻烦。Douglas Crockford的代码是这样的:
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
false == "false" // false
false == "0" // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true
因此,推荐任何时候都使用"==="(精确判断)比较符。
10.基本类型的包装对象
Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。
new Boolean(false);
new Number(1234);
new String("Hello World");
与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。
alert( typeof 1234); // number
alert( typeof new Number(1234)); // object
浏览器发展史
早期浏览器大战
由于互联网刚兴起,各种浏览器也层出不穷,而各个商家的浏览器支持的浏览器脚本也不太一样。其中微软在1996年8月发布了自己的浏览器IE3。IE3 并不支持JavaScript,而是支持自家研发的脚本语言JScript。
网景提交JS标准
1996年11月,网景向ECMA提交语言标准,由于版权问题,JS语言标准不叫JavaScript,而是ECMAScript。
JavaScript与ECMAScript的区别在于,ECMAScript是标准,JavaScript是实现,实现的功能不一定会出现在标准里面。实际上JavaScript是由ECMAScript,DOM和BOM三者组成的
网景之死
为了推广自家浏览器,微软将IE浏览器直接捆绑进了Windows系统中。这一举动,直接让IE浏览器占据了市场绝大部分的份额。1998年,为了抗衡IE浏览器,网景公司直接把自家的浏览器开源(FireFox前身),但是仍然难逃被收购的命运。Brenden之后一直在协助维护这个网景开源的浏览器。
IE6如日中天
2001年,IE6和Windows XP系统一起发布。至2004年,IE6已经占据了市场的80%以上。然而这款浏览器却不兼容W3C标准(主要是CSS)。
看见IE6独霸一方,无人可敌,微软直接把IE6开发团队给解雇了一大部分,导致IE6不断爆出安全漏洞。这种情况下,FireFox重新出山,希望打败IE。
看到FireFox的东山再起,微软重新组建的团队开发IE7。2005年,IE7发布,但是由于开发团队能力不如IE6的团队,IE7也干不过自家兄弟IE6。
2006年,主流浏览器除了IE6还有一个FireFox。但由于盗版XP系统在中国横行,直至2010年中国浏览器市场仍然被IE6占据。这也成为了中国前端开发的噩梦(需要不断兼容IE),大大阻碍了中国前端的发展。
Chrome横空出世
2004年,谷歌雇用了一些FireFox和IE的开发者进行自己浏览器Chrome的开发。
2008年,Chrome浏览器发布,并迅速拿下1%的市场份额。由于Chrome浏览器非常快,越来越受到市场的欢迎。
2011年,Chrome浏览器的市场份额超越FireFox。
2016年,Chrome浏览器的市场份额达到62%。Chrome的腾飞结束了中国前端开发者被IE折磨的日子。2016年,淘宝天猫宣布不再支持IE6、7;同年年底,宣布不再支持IE8。
移动市场颠覆格局
2010年iPhone4发布,宣告智能手机时代来临。但是无论是IOS系统(Safari),还是Android系统(chrome)都不支持IE浏览器。
微软见此情况和Nokia联合起来,但最终还是Nokia在手机行业宣告失败,手机业务被微软收购。可以认为,手机上基本见不到IE了。
至此,前端开发者可以不再需要考虑IE用户的需求,摆脱了被IE支配的日子,前端从此极速发展。
ECMAScript标准
ECMAScript各个版本
1997年6月,第一版ECMAScript发布。
1999年12月,第三版ECMAScript发布,这也是应用最广泛的ECMAScript版本。
第四版流产。
第三版发布后,经过了10年,20019年12月第五版ECMAScript才发布,这正是因为这段时间IE浏览器正制霸着市场。
随着Chrome的崛起,这些新的浏览器的JS引擎都根据ECMAScript标准进行实现。所以除了IE,其他浏览器与浏览器之间的兼容性得到大大提高。
2015年6月,ECMAScript第六版(ES6)发布。并在之后每一年都发布一版。可见JS地位在不断提高。
JavaScript与ECMAScript的区别在于,ECMAScript是标准,JavaScript是实现(实际上JavaScript是由ECMAScript,DOM和BOM三者组成的),实现的功能不一定会出现在标准里面,不同的浏览器也有自己独特的JS实现。
JS的发展
JS的兴起--Gmail的诞生
2004年愚人节,谷歌发布Gmail。Gmail是谷歌开发的一款具有发送接收邮件功能的在线网页。在Gmail出现以前,所有人都认为浏览器只能用于浏览阅读。但是Gmail让用户重新认识了浏览器的功能。
2005年,Jesse将谷歌实现Gmail的技术命名为AJAX。从此前端技术正式出现。
2006年,JQuery发布,JQuery是最长寿的JS库,其主要是兼容IE,但随着IE的落寞,JQuery也逐渐淡出前端开发者的视野。
JS的爆发--V8引擎
Chrome的JS引擎是V8(V1~V7是不同语言的引擎),V8引擎超快的速度让chrome成为了最主流的浏览器。
2009年,Ryan基于V8,创建了Node.js;2010年Issac基于Node.js写出了npm。有了node.js,前端工程师实现了在浏览器之外执行JS。
2010年,TJ受Sinatra的启发,发布了Express.js。Node.js与Express.js让前端工程师可以完成后端的内容。虽然还比不上Java,但是至少也具备了手段。
借助Chrome的风,期间也爆发除了很多前端的技术:gulp、grunt、yeoman、require.js、webpack、Angular、React、Vue等。当然其中一些技术也已经过时了。
,