《JavaScript的历史》

236 阅读6分钟
本文章参考了阮一峰的博客和维基百科。(附上链接)
维基百科:https://link.zhihu.com/?target=https%3A//zh.wikipedia.org/wiki/JavaScript%23%25E5%258E%2586%25E5%258F%25B2

阮一峰:https://link.zhihu.com/?target=http%3A//www.ruanyifeng.com/blog/2011/06/birth_of_javascript.html

阮一峰:https://link.zhihu.com/?target=http%3A//www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html

JavaScript历史由来

1.了解JavaScript的历史使我们知道他是如何被设计出来的,以及了解到JavaScript为什么是现在这个样子。
2.1994年网景公司发布了历史上第一个比较成熟的网络浏览器Navigator浏览器0.9版,但是这个版本的浏览器只能用来浏览,缺乏与访问者互动的功能,因此网景公司急需一种网页脚本语言,是的浏览器可以网页互动。。。
当时的网景公司有两个选择,一是采用现有的语言,比如Perl、Python、Tcl、Scheme等,将其直接嵌入网页,这一选择有利于充分利用现有代码和程序员资源,推广起来比较容易;另一种是直接发明一种全新的网页脚本语言,这一选择有利于开发出完全适用的语言,实现起来也比较容易。当时的网景公司内部对于这两种选择争执不下,管理层一时难下决心。
1995年Sun公司对Java进行推广,并宣传Java可以一次编写到处运行,于是网景公司与Sun公司联盟,允许Java以applet的形式再浏览器中运行,但由于将Java作为脚本语言嵌入网页会使网页过于复杂,于是就放弃了这一想法。后来JavaScript为了蹭Java的热度才将这一语言命名为JavaScript。
4.34岁的程序员Brendan Eich于1995年4月进入网景公司,网景公司录用他的目的是为了让他研究将scheme语言作为网页脚本语言的可能,而他本人对函数式编程较为感兴趣。但一个月之后网景公司希望未来的脚本语言必须看上去于Java足够相似但要比Java简单,让非专业的网页作者也能快速上手。
5.但Brendan Eich对Java没有丝毫兴趣,为了应付差事,他用了10天的时间设计出了JavaScript,这也导致JavaScript的一些细节不够严谨,遭人诟病,且再很长的一段时间内,JavaScript写出的程序非常混乱。
Brendan Eich的设计JavaScript借鉴了C语言的基本语法,Java语言的数据类型和内存管理,scheme语言的函数提升一等公民和self语言的原型继承机制。所以JavaScript使两种语言的混合产物--简化的函数式编程 + 简化的面向对象编程。
6.受Java的影响,JavaScript的数据类型也分为基本类型和对象类型。且Y2K(千年虫问题)于Java直接相关,Date.getYear()返回的应该是年份的最后两位:
var date1 = new Date(1999,0,1);

var year1 = date1.getYear();

alert(year1); // 99
但实际上,对于2000,却返回100。
var date2 = new Date(2000,0,1);

var year2 = date2.getYear();

alert(year2); // 100
这会造成网页上的一些错误,Brendan Eich本人就非常不满这一点,于是他又添加了一个返回四位数年份的Date.getFullYear()函数。
7.如果不是公司决策,Brendan Eich绝不可能把Java作为JavaScript设计的原型,作为设计者,他一点也不喜欢自己的这个作品:

JavaScript的10个设计缺陷:(来自阮一峰博客)

1.出现缺陷的原因:

  • 设计阶段过于仓促,短短十天一门新语言就问世了;
  • 没有先例,同时结合了函数式编程和面向对象编程的特点,至今为止史无前例,无从参考;
  • 过早标准化,还未来得及调整设计,国际标准再JavaScript推出一年半后就问世了;

2. 10个缺陷

  1. 不适合大型开发:没有命名空间,难以模块化,没有如何将代码分布在多个文件的规范,允许同名函数重复定义且后定义可覆盖之前的定义,因此很不利于模块化加载;
  2. 标准库小:只能完成一些基本操作,很多功能都不具备;
  3. null和undefined:null属于对象,以为对象为空,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.加号运算符:+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。这样的设计,不必要地加剧了运算的复杂性,完全可以另行设置一个字符连接的运算符。
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.基本类型的包装对象:Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。作用很小,却造成很大的混淆。
虽然JavaScript有很多设计缺陷,但是他的编程能力很强大,前途很光明,遵守良好的编程规范加上第三方库的帮助,JavaScript这些缺陷可以大部分规避。且JavaScript使目前唯一的网页编程语言,只要互联网继续发展,他就必然一起发展。。。