JavaScript博客

JavaScript的历史

JavaScript的诞生

JavaScript是由布兰登·艾克(Brendan Eich)设计,于1995年发型的一种高级的、解释型的编程语言。

1995年,网景招募了布兰登·艾克,目标是把Scheme语言嵌入到Netscape Navigator浏览器当中。但更早之前,网景已经跟昇阳合作在Netscape Navigator中支持Java,这时网景内部产生激烈的争论。后来网景决定发明一种与Java搭配使用的辅助脚本语言并且语法上有些类似,这个决策导致排除了采用现有的语言,例如Perl、Python、Tcl或Scheme。为了在其他竞争提案中捍卫JavaScript这个想法,公司需要有一个可以运作的原型。艾克在1995年5月仅花了十天时间就把原型设计出来了。

JavaScript最初命名为Mocha,1995年9月在Netscape Navigator 2.0的Beta版中改名为LiveScript,同年12月,Netscape Navigator 2.0 Beta 3中部署时被重命名为JavaScript,当时网景公司与昇阳电脑公司组成的开发联盟为了让这门语言搭上Java这个编程语言“热词”,因此将其临时改名为JavaScript,日后这成为大众对这门语言有诸多误解的原因之一。

JavaScript的标准化

标准化
1996年11月,网景正式向ECMA(欧洲计算机制造商协会)提交语言标准。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。JavaScript成为了ECMAScript最著名的实现之一。除此之外,ActionScript和JScript也都是ECMAScript规范的实现语言。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是JavaScript具有非常丰富的特性。

JavaScript的历史发行版本

版本 发布日期
1.0 1996年3月
1.1 1996年8月
1.2 1997年6月
1.3 1998年10月
1.4
1.5 2000年11月
1.6 2005年11月
1.7 2006年10月
1.8 2008年6月
1.8.1
1.8.2 2009年6月
1.8.5 2010年7月

ECMAScript的历史发行版本

版本 发布日期
第一版 1997年6月
第三版 1999年12月
第四版 中途废弃
第五版 2009年12月
第六版 2015年6月

JavaScript的10个设计缺陷

以下内容摘自http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html

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
       };
 
   }

原因是解释器自动在return语句后面加上了分号。

 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

关于Javascript的更多怪异行为,请参见Javascript Gardenwtfjs.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。