ECMAScript - JavaScript的标准
2008-11-15 11:42
351 查看
JavaScript历史
JavaScript是由网景通讯公司(Netscape)最初在它的Navigator 2.0产品上设计并实现的,原名LiveScript。之所以从LiveScript改名为JavaScript主要是当时Netscape公司和Sun公司达成了合作协议,因此Netscape的高层决定更名,并且要求JavaScript设计者采用类似Java的句法(Syntax)。所以可以发现JavaScript的句法与Java十分接近,甚至照搬了所有的Java的关键字,尽管有大量的关键字实际上在JavaScript(至少在JavaScript 2.0之前)是没有用的。
虽然句法非常接近,但JavaScript的语义与Java有很大的差异。相反,JavaScript的语义与Self、Lisp等语言较为接近,例如其原型继承、closure支持等。尽管它们的句法截然不同。 JavaScript被设计为一种函数式编程语言,因此能够实现尽量小而且规范的engine,这样在浏览器等应用里嵌入JavaScript也比较容易实现。
未来的JavaScript 2.0在句法上也会引入一些独特的与Java不同的特性。为了避免与Java发生混淆,现在逐渐有使用JS(来源于JavaScript或JScript的一种简略称呼)来称呼这种语言的趋势。 JScript是对Microsoft版本的JavaScript的称呼,关于JScript和标准ECMAScript之间的差别可以参考这里http://www.ajaxbbs.net/blog/Jscript-vs-Ecmascript/
JavaScript版本历史
版本 | 说明 | 实现 |
JavaScript 1.0 | 原始版本。 | 由Netscape 2 实现。 |
JavaScript 1.1 | 引入真正的Array对象,消除了大量错误。 | 由Netscape 3 实现。 |
JavaScript 1.2 | 引入switch语句、正则表达式和大量新特性,基本上符合ECMAv1。 | 由Netscape 4 实现。 |
JavaScript 1.3 | 修正了不兼容性,符合ECMAv1。 | 由Netscape 4.5 实现。 |
JavaScript 1.4 | 只由Netscape 服务器产品 实现。 | |
JavaScript 1.5 | 引入了异常处理,符合ECMAv3。 | 由Mozilla和Netscape 6 实现。 |
JavaScript 1.6 | Array和String上增加了通用方法。支持E4X。 | Firefox 1.5以上开始支持。 |
--- | --- | --- |
JScript1.0 | 基本上相当于JavaScript1.0。 | 由IE 3 的早期版本实现。 |
JScript2.0 | 基本上相当于JavaScript1.1。 | 由IE 3 的后期版本实现。 |
JScript3.0 | 基本上相当于JavaScript1.3,符合ECMAv1。 | 由IE 4 实现。 |
JScript4.0 | 一个中间版本,没有出现在任何Web浏览器中。 | |
JScript5.0 | 支持异常处理。部分符合ECMAv3。 | 由IE 5 实现。 |
JScript5.5 | 基本上相当于JavaScript1.5,符合ECMAv3。 | 由IE 5.5 实现。 |
JScript5.6 | 修补了一些bug。 | 由IE 6 实现。 |
JScript 7.0 | ||
JScript 8.0 | ||
--- | --- | --- |
ECMA-262 v1 | 标准化了JavaScript1.1的基本特性,并添加了一些新特性。没有标准化switch语句和正则表达式。 | 由Netscape 4.5 和IE 4 实现。 |
ECMA-262 v2 | ECMA v1的维护版本,只添加了说明。 | 由Netscape 4.5 和IE 4 实现。 |
ECMA-262 v3 | 标准化了switch语句、异常处理和正则表达式。 | 由Mozilla、Netscape 6 和 IE 5.5 实现。 |
ECMA-357 | E4X (ECMAScript for XML) 是JavaScript的内建XML处理规范,最初由BEA提出,现已成为ECMA标准。 | BEA WebLogic 的内建JS引擎实现。最新的 SpiderMonkey 和 Rhino 实现。 |
Mozilla的SpiderMonkey(C语言实现),所有基于Gecko的产品如 Firefox, Thunderbird 等都使用它。
Mozilla的Rhino(Java实现)。
Microsoft公司的JScript。
Digital Mars公司的DMDScript。
据测试,Spidermonkey的性能最好(不知道真假)。目前ECMA-262 4th Edition正在开发的过程中,与其对应的JavaScript的版本为JavaScript 2.0,目前也正在开发过程中。
JavaScript的问题
JavaScript 语言具有许多极好的特性,也是历史上最成功的语言之一。但是不可避免,JavaScript也存在一些问题。JavaScript 的最初实现有太多bug,其中有些bug甚至被错误的纳入了ECMA标准。例如 typeof null 返回 'object'。
JavaScript 带有太多 Java 的烙印。包括无必要的引入了所有 Java 的保留字。包括继承了 Java 最初的 Y2K 问题(所以现在就有 Date.getYear 和 Date.getFullYear 两个方法,加上JScript武断的改变了前者的行为,造成了向前和向后的兼容问题)。
ECMAScript 的规范文本可读性太差,导致实现者和开发者的问题。
ECMAScript 的规范存在bug或缺失,导致 JavaScript 的各种实现之间存在不少微妙的差异。
一方面 ECMAScript 的标准过于早熟,另一方面 ECMAScript 4 的开发长期处于停滞状态。并且整个 JS community 对于JS未来的方向意见有较大分歧。
由于最初把 ECMAScript 限定为脚本语言,因此导致 JS 始终缺乏一些现代编程所必需的要素。最典型的就是标准的package机制,这是团队编程时模块化和可伸缩性的基本需求。因此几乎所有的JS开发框架都需要自行实现一套package机制。专门处理package机制的开源项目包括:jspkg、pies、jsan等。
ECMAScript的规范可以从这里下载:
http://www.ecma-international.org/publications/standards/Ecma-262.htm
BlogJava上有人给出了对应的中文总结:
http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html
如果要使用JavaScriptEngine,需要了解的可能就是如何定义JavaScript所定义的DOM模型,JavaScript脚本中不限定变量的类型,同样一个标识既可以是对象也可以是函数或属性值。对函数的取值就是对函数的调用。JavaScript Engine只用来做取值,计算,赋值。
原始数据类型
ECMAScript原始数据类型有五种:Undefined、Null、Boolean、Number、String。
typeof—判断变量和值的数据类型,通常有undefined、boolean、number、string、object五种类型。
Undefined—当变量被声明但没有初始化,或函数没有明确返回一个值的时候,该变量或函数即为 Undefined 类型。
Null—undefined是null的一种派生,当代表一个对象的值不存在时,该对象返回null。
Boolean—包含两个值,true and false , false不等于0,但0可以转换为false 。
Number—可以定义32位整型数据或64位浮点型数据。定义数字类型变量时,在数字前加0即为八进制,加0x为十六进制,它们计算后返回的结果统一为十进制。通过var f = 1.0可以定义一个浮点类型变量,有意思的是,当f被用于计算之前,它实际是以 String类型存储的。当浮点类型数据很大或很小时(可以前后移动六位),将使用E表示法来表示浮点数据,最大可以存储17位数据。另外,isFinite()方法可以判断一个数值是否有限,isNaN()方法可以判断一个数据是非数字类型。
String—String在ECMAScript中是原始数据类型,并且是唯一没有空间大小限制的数据类型。和Java不同的是,var s = " javascript " 和var s = 'javascript'均是合法的表示方法。
相关文章推荐
- 关注javascript的语言标准规范和发展——ECMAScript
- 每天进步一点点-JavaScript之ECMAScript(继JavaScript标准) 引用类型
- 理顺 JavaScript (5) - 符合 ECMAScript 标准的字符串函数
- JavaScript对象初始化的标准过程(对象字面量) - 基于ECMAScript-262 V5.1
- 每天进步一点点-JavaScript之ECMAScript(继JavaScript标准)原始类型(primitive type)
- $.parseJSON() 函数用于将符合标准格式的的JSON字符串转为与之对应的JavaScript对象。
- 在javascript中什么是伪数组?如何将伪数组转换为标准数组?
- ECMAScript 6(以下简称ES6)是JavaScript
- ECMAScript 6(以下简称ES6)是JavaScript
- JavaScript程序设计——第2章 ECMAScript基础
- JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
- JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
- JavaScript中的标准对象
- 学习JavaScript第二课:Javascript和EcmaScript
- ECMAScript和JavaScript的联系
- 笔记——JavaScript 高级程序设计(1)——ECMAScript基础
- 读《JavaScript 标准参考教程(alpha)阮一峰》(上)
- JavaScript的组成—ECMAScript、BOM和DOM
- ECMAScript和JavaScript的关系
- 读《JavaScript 标准参考教程(alpha)阮一峰》(下)