浅述Javascript

210 阅读7分钟

Javascript历史

avaScript的诞生

回顾它的历史,就要从浏览器的历史讲起。 1990年底,欧洲核能研究组织(CERN)科学家 Tim Berners-Lee,在全世界最大的电脑网络——互联网的基础上,发明了万维网WWW(World Wide Web),从此可以在网上浏览网页文WWW件。最早的网页只能在操作系统的终端里浏览,也就是说只能使用命令行操作,网页都是在字符窗口中显示,这当然非常不方便。 1992年底,美国国家超级电脑应用中心(NCSA)开始开发一个独立的浏览器,叫做 Mosaic。这是人类历史上第一个浏览器,从此网页可以在图形界面的窗口浏览。 1994年10月, Mosaic 通信公司(Mosaic Communications),不久后改名为 Netscape。这家公司的方向,就是在 Mosaic 的基础上,开发面向普通用户的新一代的浏览器 Netscape Navigator。 1994年12月,Navigator 发布了1.0版,市场份额一举超过90%。 Netscape 公司很快发现,Navigator 浏览器需要一种可以嵌入网页的脚本语言,用来控制浏览器行为。因为当时上网的速度很慢而且上网费很贵,尤其是一些操作不宜在服务器端完成, 因此Netscape 公司就想开发一个脚本语言,对于这种语言的要求就是:功能不需要太强,语法较为简单,容易学习和部署。同样时间内正是Sun 公司的 Java 语言推广很成功时间,两家公司当即合作准备发明一款与Java语言接近而且支持Java程序的脚本语言。 1995年,Netscape 公司雇佣了程序员 Brendan Eich 开发这种网页脚本语言。Brendan Eich临危受命,仅仅用了10天时间,Javascript问世;而这个语法是一个大杂烩,语法来源很广。

• 基本语法:借鉴 C 语言和 Java 语言。 • 数据结构:借鉴 Java 语言,包括将值分成原始值和对象两大类。 • 函数的用法:借鉴 Scheme 语言和 Awk 语言,将函数当作第一等公民,并引入闭包。 • 原型继承模型:借鉴 Self 语言(Smalltalk 的一种变种)。 • 正则表达式:借鉴 Perl 语言。 • 字符串和数组处理:借鉴 Python 语言

1995年12月4日,Netscape 公司与 Sun 公司联合发布了 JavaScript 语言,对外宣传 JavaScript 是 Java 的补充,属于轻量级的 Java,专门用来操作网页。 1996年3月,Navigator 2.0 浏览器正式内置了 JavaScript 脚本语言。

Javascript与Jscript

1996年8月,微软模仿 JavaScript 开发了一种相近的语言,取名为JScript(JavaScript 是 Netscape 的注册商标,微软不能用),首先内置于IE 3.0。这一操作撼动了当时Netscape公司在游览器脚本语言的主导权力,为此Netscape公司决定将 JavaScript 提交给国际标准化组织 ECMA(European Computer Manufacturers Association),希望 JavaScript 能够成为国际标准,以此抵抗微软。

Javascript与ECMAScript

在 Netscape公司将Javascript提交ECAMA后,1997年7月,ECMA 组织发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,之所以不叫 JavaScript是因为Netscape公司将Javascript注册为标而且Java 是 Sun 公司的商标,根据一份授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字。 ECMAScript 只用来标准化 JavaScript 这种语言的基本语法结构,与部署环境相关的标准都由其他标准规定,比如 DOM 的标准就是由 W3C组织(World Wide Web Consortium)制定的。

ECMAScript的几个版本

• 1997年7月,ECMAScript 1.0发布。 • 1998年6月,ECMAScript 2.0版发布。 • 1999年12月,ECMAScript 3.0 • 2007年10月,ECMAScript 4.0版草案发布 • 2008年7月, ECMAScript 3.1发布 • 2009年12月,ECMAScript 5.0版 正式发布 • 2015年6月,ECMAScript 6 正式发布,并且更名为“ECMAScript 2015”,此后每年版本以当年年份作为命名。

Javascript的缺点

“它的优秀之处并非原创,它的原创并不优秀” - JS之父

JavaScript 只是一种轻量级的脚本语言。所谓“脚本语言”(script language),它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序(比如浏览器)的“脚本”。而且它的诞生并未由严密和长时间的修改,仅仅用了十天就创作出来,这导致他的缺点一直为人诟病下面列举几个常见的很无奈的问题 • 不适合开发大型程序 Javascript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。 • 非常小的标准库 Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。 • null和undefined null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。

var foo;
alert(foo == null); // true
alert(foo == undefined); // true
alert(foo === null); // false
alert(foo === undefined); // true

• 全局变量难以控制 Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。

a = 1;
(function(){
b=2;
alert(a);
})(); // 1
alert(b); //2

   • 自动插入行尾分号 Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。 比如,下面这个函数根本无法达到预期的结果,返回值不是一个对象,而是undefined。

function(){
return
{
i=1
};
}

   解释器给你加上了一个很无奈的分号

function(){
return;
{
i=1
};
}

• 加号运算符 +号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。

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

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

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

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

NaN === NaN; //false
NaN !== NaN; //true
alert( 1 + NaN ); // NaN

与其设计NaN,不如解释器直接报错,反而有利于简化程序。 • 数组和对象的区分 由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。Douglas Crockford的代码是这样的:

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

• == 和 === ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。

"" == "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

因此,推荐任何时候都使用"==="(精确判断)比较符。

• 基本类型的包装对象

Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。

new Boolean(false);

new Number(1234);

new String("Hello World");

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

alert( typeof 1234); // number

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