JavaScript 的诞生

139 阅读4分钟

1. JavaScript 的历史

在1994年,当时的网景公司(Netscape)凭借Navigator这个浏览器成为了Web时代开启最著名的第一代的互联网公司。当时所用的第一版本的浏览器就是下图中的浏览器,相信有很多年轻朋友都没有见过这种浏览器。如果大家回想十年前或是十五年前,大家用的浏览器应该是IE浏览器,那个时候的浏览器跟现在的比如说谷歌浏览器火狐浏览器等相比而言,那就是天壤之别了。
整个浏览器都是静态的,也就是用HTMLCSS写的,并没有像今天的各种浏览器一样具有各种各样的动态效果了,比如像网页的图片轮播、鼠标悬浮切换等效果。能实现网页动态效果的编程语言,并将其编程语言命名为JavaScript为什么会命名为JavaScript呢?原因是在当时,Java非常火,网景公司希望借用Java在当时的名气来进行推广。其实事实上呢,JavaScript除了语法上有点像Java外,别的地方都跟Java没有任何关系。

2. JavaScript 诞生记

1995年4月,BrendanEich(布兰登·艾奇) 加入网景公司。Brenden原本研究方向是函数式编程与Scheme语言。但是1995年5月,网景公司指定Brenden成为了“新语言”的设计师。并且要求这个“新语言”要和Java足够的相似(面向对象思想),但是要比Java能够更加简单地上手。
Brenden志不在此,而且对Java完全不感兴趣,为了完成任务他花了10天时间便把这门“新语言”的最初版本设计了出来。\

3. JavaScript 的10个设计缺陷

1. 不适合开发大型程序

Javascript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。

2. 非常小的标准库

Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。 3. null和undefined

null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。两者非常容易混淆,但是含义完全不同。在编程实践中,null几乎没用,根本不应该设计它。
4. 全局变量难以控制

Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。
5. 自动插入行尾分号

Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
6. 加号运算符

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

alert(1+10); // 11

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

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

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

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

7. NaN

NaN是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:与其设计NaN,不如解释器直接报错,反而有利于简化程序。

NaN === NaN; //false

NaN !== NaN; //true

alert( 1 + 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