ECMAScript 基础

来源:互联网 发布:安知玉如意txt 编辑:程序博客网 时间:2024/04/26 03:42

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 中却是原始数据类型。

原文地址:http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html

 

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 )。

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原始数据类型,因为它是伪对象。

 

Functions是ECMAScript的核心,在任何时候任何地方都可以运行的一组代码语句。

 

代码
  1. function functionName(arg0, arg1, ……, argN) {   
  2.   statements   
  3. }  

 

当function没有返回值或return语句后没有值的时候,该function实际上会被系统定义为undefined,当function返回值的时候,function可以不必明确指定为某种数据类型。

关于重载

重载是面向对象语言的基本特性之一,但ECMAScript的functions并不能重载,在同一范围里可以定义两个完全相同的函数,在调用函数的时候,最后的一个函数发挥作用。这种特性比较麻烦,但可以通过arguments对象来实现和重载类似的功能。

 

代码
  1. function func() {   
  2.   if(arguments.length == 1) {   
  3.     alert(arguments[0] + 5);   
  4. else if (arguments.length == 2) {   
  5.   alert(arguments[0] + arguments[1]);   
  6. }   
  7. }   
  8. func(5);  //输出10   
  9. func(1015);  //输出25  

 

前面提到过,在同一范围里可以定义两个完全相同的function,在调用function的时候,最后的一个function发挥作用。

 

代码
  1. function func(i) {   
  2.   alert(i + 10);   
  3. }   
  4. function func(i) {   
  5.   alert(i + 20);   
  6. }   
  7. func(5);  //输出25  

 

可以看出,是调用了最后的一个function使得数据结果为25,如果使用Function类来定义以上两个函数,那为什么会使用最后的一个function可能会更明确一些。

 

代码
  1. var func = new Function(“i”, “alert(i + 10)”);   
  2. var func = new Function(“i”, “alert(i + 20)”);   
  3. func(5);  

 

func指向了另外一个引用,从而值发生了改变,func是作为function对象的引用而存在的,并且允许两个变量指向同一个function。

和Function类相关的属性、方法有许多,例如length、toString()、valueOf()等等。其中toString()在调试程序中使用较多。[/code]

原创粉丝点击