对于JavaScript 的诞生过程的感想

156 阅读5分钟

最近看了一些JavaScript诞生过程的资料,感觉JavaScript的诞生过程就是一个屌丝逆袭的过程,JS一开始设计时,就如同一门玩具语言一样存在许多问题,就连设计者本人也不重视这门语言,但是JS却奇迹般地每一次都走对了风口,从一开始的不被看好,随意设计,就连名字都是碰瓷Java语言,到后来的一点点在浏览器领域打败各类语言,活到最后,可以看出语言的优秀之处并不完全取决于它自生的优秀之处,还取决于它带给这个世界的价值,单论语言本身,JS可能并不是十分优秀,但是从带给这个社会的价值上来看,JS无疑是优秀的。

1.JavaScript之父

布莱登被称为JavaScript之父。

以前的浏览器不能与网页进行交互,如果网页上有表单或者其他输入框等需要用户填写的模块,若用户未填写,浏览器不会自动识别,只能在发给服务器,而服务器报错后才能发现,极不方便,也浪费了很多资源。基于这种情况,网景公司任命布莱登开发一种新的脚本语言,用于直接和网页交互。而布莱登为了完成任务,在十天之内就完成了JS的设计定稿及开发。

2.JavaScript标准化

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

一般来说,完整的JavaScript包括以下几个部分:

  • ECMAScript,描述了该语言的语法和基本对象
  • 文档对象模型(DOM),描述处理网页内容的方法和接口
  • 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口

JavaScript的基本特点如下:

  • 是一种解释性脚本语言(代码不进行预编译)。
  • 主要用来向HTML页面添加交互行为
  • 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

JavaScript常用来完成以下任务:

  • 嵌入动态文本于HTML页面
  • 对浏览器事件作出响应
  • 读写HTML元素
  • 在数据被提交到服务器之前验证数据
  • 检测访客的浏览器信息
  • 控制cookie,包括创建和修改等

3.JavaScript的十大缺陷

由于JavaScript的设计阶段过于仓促,而且它结合了函数式编程和面向对象编程的特点,是历史上的第一例,没有先例可以参考,同时Javascript在推出一年半之后,国际标准就问世了,过早的标准化使Javascript的规格还没来及调整就固化了,因此导致了Javascript的设计不够完善,有很多失误。

如果遵守良好的编程规范,加上第三方函数库的帮助,Javascript的缺陷大部分可以回避,Javascript目前是网页编程的唯一语言,会跟随着互联网不断发展,同时只要发布新版本的语言标准,就可以弥补这些设计缺陷。

以下为列举的10个缺陷:

(1)不适合开发大型程序

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

(2)非常小的标准库

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

(3)null和undefined易混淆,但是含义完全不同

null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。在编程实践中,null几乎没用。

(4)全局变量难以控制

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

(5)自动插入行尾分号

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

(6)加号运算符

+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。这样的设计,不必要地加剧了运算的复杂性。

(7)无需设计NaN

NaN是一种数字,表示超出了解释器的极限,去掉NAN更有利于简化程序。

(8)数组和对象的区分

由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。

(9)== 和 ===

==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。因此,推荐任何时候都使用"==="(精确判断)比较符。

(10)基本类型的包装对象

Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。

详解请看阮一峰的网络日志