http://www.cnblogs.com/chenyong677/archive/2008/11/15/1334050.html
ECMAScript - JavaScript的标准 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 实现。
JavaScript已经被Netscape公司提交给ECMA制定为标准,称之为ECMAScript,标准编号ECMA-262。目前最新版为ECMA-262 3th Edition。符合该标准的实现至少有:
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'均是合法的表示方法。
http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html
ECMAScript 基础 作者: Flyingis
JavaScript的核心之一ECMAScript的语言特性和Java、C、Perl都有许多相似之处,其中不少特性都是从这些语言借鉴而来,同时它们之间也存在许多差异。下面列举一些ECMAScript的基本特性。
--和Java一样,ECMAScript区分大小写,注释的格式相同,通过{}确定代码块,原始数据类型存储在堆栈,对象的引用存储在堆中
--ECMAScript是一种松散的语言,ECMAScript通过var操作符声明变量,并且不限类型,例如var n = 25,那么n就是数字类型,var n = "string" ,那么n就是String类型
--在每一行代码后,可以不写分号,ECMAScript自动认为该行的末尾为该行代码的最后;ECMAScript中的变量可以不用初始化,在幕后系统将自动完成初始化操作
--同一变量可以赋予不同类型的数据;变量的第一个字符只能是字母、下划线或$ ,其他的字符可以是下划线、$、或任意的字母、数字、字符
--和其他语言一样,变量最好遵循驼峰书写法,或Pascal表示法、或匈牙利表示法
--和大多数语言不同的是, ECMAScript 变量在使用之前可以不必声明,系统会自动将该变量声明为全局变量,例如var m = " Good " ; n = m + " Morning " ; alert(n)输出结构是 " Good Morning "
--在大多数语言里,String是对象,在ECMAScript中却是原始数据类型
原始数据类型
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'均是合法的表示方法。
数据转换
在不同数据类型之间转换是任何一门编程语言的一个重要特性,ECMAScript提供了一系列简单的方法来实现数据的转换,大多数数据类型都提供了简单的转换方法,对于复杂的转换则有一些全局方法来完成,不管是哪一种方法,ECMAScript中数据转换都非常简单。
Boolean、number和string数据类型是原始数据类型,但它们同时是伪对象(在ECMAScript中伪对象到底该怎么解释,运行机制如何还不清楚?有人知道请给予解答),拥有自己的属性和方法,可以通过toString()方法来实现string类型的转换。ECMAScript定义所有的对象,不管是伪对象还是真实的对象,都可以实现toString()方法,string被列为伪对象的行列,自然也拥有toString()方法。将数字类型数据转换为string的时候,可以在 toString() 方法中加入2、8、16参数,来实现不同进制的数据输出,例如var n = 10; alert(n.toString(2))输出为1010,alert(n.toString(8))输出为12,n.toString()和n.toString(10)相同。
ECMAScript提供了两种方法来实现string类型转化为数字类型的方法:parseInt()和parseFloat()。其他类型转换将会返回 NaN(Not a Number)。
Type Casting
ECMAScript数据类型的转换通常可以通过三个方法来实现:Boolean(value)、Number(value)和String(value),这样通常会产生一些非预期的结果。
Boolean
var b1 = Boolean( "" ); // false–empty string
var b2 = Boolean( " hi " ); // true–non-empty string
var b3 = Boolean( 100 ); // true–non-zero number
var b4 = Boolean( null ); // false-null
var b5 = Boolean( 0 ); // false-zero
var b6 = Boolean( new Object()); // true–object
Number
Number( false ) 0
Number( true ) 1
Number(undefined) NaN
Number( null ) 0
Number( " 5.5 " ) 5.5
Number( " 56 " ) 56
Number( " 5.6.7 " ) NaN
Number( new Object()) NaN
Number( 100 ) 100
String
String()能实现所有类型数据的直接转换,和使用toString()不同的是,String()能够将null或undefined数据转换为string。
引用类型
ECMAScript 实际上并没有传统意义上的类,只是通过定义对象来等同于其他语言中的类,这一点我还比较含糊,以后可能会明白,在文中还是以“类”来说明。
var ob = new Object();
以上定义了一个Object对象的实例,这种语法和Java比较类似。当有参数的时候需要括号来引用,当不存在参数时,括号可以去掉。由于ECMAScript语言比较松散,不管是前面所属的基础语法,还是后面将提到的语法知识,我们都应该尽量按照一定的书写规范来约定自己的代码格式,而不应充分发挥语言松散的特点。
Object类
Object类和Java里的java.lang.Object类比较相似,它是ECMAScript中其他所有类的基类,它具有如下属性:
constructor—建立对象的函数的一个引用,对于Object类而言,该引用指向本地Object()方法。
prototype—对象里prototype对象的一个引用值。
Object 类拥有的方法:
hasOwnProperty(property)—判断property属性是否存在于对象中,property数据类型为string
isPrototypeOf(object)— 判断一个对象是否是另一对象的 prototype
propertyIsEnumerable(property)— 判断所给出的属性能否使用 for 语句列举出来
toString()—返回对象的原始类型string
valueOf()—返回对象合适的原始值,对于多数类而言,返回的值和toString()相同
Object类的每一个属性和方法都被其他的类所重写
Boolean类
定义方法var ob = new Boolean(true); ob是Boolean原始数据类型的一个引用。在使用Boolean对象过程中,需要注意,所有的对象会自动转变为true,因此var ob1 = new Boolean(false); var ob2 = ob1 && true; 最后ob2的值是true,非false。一般情况下,使用Boolean原始数据类型可以避免这种情况。
Number类
定义方法var o = new Number(15);
获得原始数据的值var n = o.valueOf();
Number类有一些为数字类型的值特别设计的方法:
alert(o.toFixed( 2 )); // 输出15.00
alert(o.toExponential( 1 )); // 输出1.5e+1
在无法确定使用 toFixed 还是 toExponential 的时候,可以使用 toPrecision 方法来获得取值:
alert(o.toPrecision( 1 )); // 输出 2e+1
alert(o.toPrecision( 2 )); // 输出 15
alert(o.toPrecision( 3 )); // 输出 15.0
String类
String类是一种复杂引用类型,这里仅列出一些常见的方法,其中不少都是模仿java.lang.String:
var s = new String( " Good Morning " );
alert(s.valueOf() == s.toString()); // 输出true
alert(s.length); // 输出12
alert(s.charAt( 1 )); // 输出o
var sr = s.concat( " ! " ); alert(sr); // 输出Good morning !
alert(s.indexOf( " o " ); // 输出1
alert(s.lastIndexOf( " o " ); // 输出6
alert(s.localeCompare(Good morning)); // 输出0
alert(s.localeCompare(Apple)); // 输出1
alert(s.localeCompare(House)); // 输出-1
alert(s.slice( 2 )); // 输出od morning
alert(s.substring( 2 )); // 输出od morning
alert(s.slice( 2 , - 5 )); // 输出od mo
alert(s.substring( 2 , - 5 )); // 输出Go
alert(s.toUpperCase()); // 输出GOOD MORNING
alert(s.toLowerCase()); // 输出good morning
另外,所有String类的方法同样可以用于String原始数据类型,因为它是伪对象。
instanceof
instanceof操作符和typeof作用类似,不同的是,instanceof需要明确指定对象是否属于某种特定类型。例如
var s = new String( " Good morning ! " );
alert(s instanceof String);
操作符和语句
ECMAScript 中大多数操作符、语句和 Java 都比较类似,但也有一些其特有的,如 label 语句, with 语句, for-in 语句等等。
Functions
Functions是ECMAScript的核心,在任何时候任何地方都可以运行的一组代码语句。
function functionName(arg0, arg1, …… , argN) {
statements
}
当function没有返回值或return语句后没有值的时候,该function实际上会被系统定义为undefined,当function返回值的时候,function可以不必明确指定为某种数据类型。
关于重载
重载是面向对象语言的基本特性之一,但 ECMAScript 的 functions 并不能重载,在同一范围里可以定义两个完全相同的函数,在调用函数的时候,最后的一个函数发挥作用。这种特性比较麻烦,但可以通过 arguments 对象来实现和重载类似的功能。
function func() {
if (arguments.length == 1 ) {
alert(arguments[ 0 ] + 5 );
} else if (arguments.length == 2 ) {
alert(arguments[ 0 ] + arguments[ 1 ]);
}
}
func( 5 ); // 输出10
func( 10 , 15 ); // 输出25
前面提到过,在同一范围里可以定义两个完全相同的function,在调用function的时候,最后的一个function发挥作用。
function func(i) {
alert(i + 10 );
}
function func(i) {
alert(i + 20 );
}
func( 5 ); // 输出25
可以看出,是调用了最后的一个function使得数据结果为25,如果使用Function类来定义以上两个函数,那为什么会使用最后的一个function可能会更明确一些。
var func = new Function(“i”, “alert(i + 10 )”);
var func = new Function(“i”, “alert(i + 20 )”);
func( 5 );
func指向了另外一个引用,从而值发生了改变,func是作为function对象的引用而存在的,并且允许两个变量指向同一个 function。
和Function类相关的属性、方法有许多,例如length、toString()、valueOf()等等。其中toString()在调试程序中使用较多。