ECMAScript是JavaScript的核心部分,就如同其他语言的核心一样,ECMAScript描述了JavaScript的语法、类型、变量,语句,函数,运算符等。ECMAScript 和Java,C等在大部分语法现象上都很相似。同时,它是一种脚本语言,也有着和VBSript,Perl等共同的特性。下面,将简单谈一下js的类型。如没有任何编程基础的读者,请自行参阅各类书籍。
ECMAScript的共有两种类型,分别是原始值和引用值。原始值是指把值直接存储在变量里。另外一种是引用值,即把引用存储在变量里,这个引用再指向真正的对象。这个和Java、C++类似。C没有引用,只有指针。
原始类型
与原始值相对应的,ECMAScript共有5种原始类型,当变量赋值为这五种类型中的一种时,该变量存放的就是原始值。这五种原始值分别是 Undefined,Null,Boolean,Number, String。注意,ECMAScript并没有把数字类型再细分为整型,长整型,单精度型,双高精度型等。在这五种类型中,比较特殊的是 Undefined和Null。当变量已经定义,但未初始化时,其将被赋予值undefined。而Null则空对象,即对象是已经存在的,只是它的值为空。强烈建议,任何变量都必须初始化,即使当一开始还未确定赋何值时,String类型就赋值为空字符串,Boolean类型就赋值为false,数字类型就赋值为0,如果连变量类型都无法在定义时确定,那么就赋值为null。
对于这五种原始类型,ECMAScript提供一个运算符来直接检查这五种类型,它是typeof运算符。
var int=1; var str=‘1′; var bool=true; var undef; var anymous=null; alert(typeof int); alert(typeof str); alert(typeof true); alert(typeof undef); alert(typeof anymous);
在上面的运算中,要注意的是,typeof null返回的是object。这个是早期JavaScript中的一个Bug。最后还是被ECMAScript沿用了。但是,在ECMAScript 3rd的规范文档中,已经把null表述成了对象,所以typeof返回object是正确的。
类型转换
ECMAScript提供两种简单转换,分别是转换成字符串和转换成数字。实际上ECMAScript的所有类型(包括对象)都内建了一个 toString()方法(原始类型其实是伪对象,下面会阐明),该方法就是把当前值按合适的方式转换成字符串。5个原始类型都将被转换成相同字面的字符串。而对于对象,又分为宿主对象和本地对象。本地对象本身已经实现了内在的toString()方法,而宿主对象可以由开发者自行创建toString方法。另外,在字符串连接操作中,所有对象或类型都会自动调用toString()对象。
alert(‘this is a number: ’+1+‘\nthis is a boolean: ’+ true +‘\nthis is a null: ’+ null + ‘\nthis is a undefined: ’+undefined);
当要转换成数字时,可以使用parseInt和parseFloat。这两个全局函数,会把字符串中第一个无效字符前的字符串转换成数字类型。当无法完成这样的转换时,函数将返回一个特殊值“NaN”。例如:
alert(parseInt(‘1234abcd’)); alert(parseInt(‘22.5′)); alert(parseInt(‘blue’));
另外,ECMAScript还提供三种强制类型转换。分别是Boolean(value),Number(value),String(value)。 String(value)等同与对值使用toString()方法,而Number()类似与 parseInt和parseFloat,不同的时,Number()需检查整个字符串是否能有效的转换成数字类型(在ECMASript可以把ture 看成1,把false看成0)。而Boolean()比较复杂。和toString()一样,任何类型和对象也都可以强制转换成Boolean型。规则如下(见示例):
/*Boolean类型,转换后不变*/ alert(‘true:’+Boolean(true)); alert(‘false:’+Boolean(false)); /*数字类型,0为false,非0为true*/ alert(‘0:’+Boolean(0)); alert(‘4:’+Boolean(4)); /*字符串类型,空串为false,其他为true*/ alert(‘"":’+Boolean(”)); alert(‘"abcd":’+Boolean(‘abcd’)); /*undefined和null,为false*/ alert(‘undefined:’+Boolean(undefined)); alert(‘null:’+Boolean(null)); /*所有引用类型,都为true*/ alert(‘Object:’+Boolean(new Object()));
引用类型
ECMAScript除了原始类型,还有引用类型。引用类型也通常叫做类。但ECMAScript实际上是没有类这个概念的。它仅仅只能称作对象。类的实例化用new关键字来创建。例如var o = new Object();ECMAScript中的类分别有:
- [*]Object类是其他所有类的基类,Object类中的所有属性和方法都会出现在其他类中。对于Object类,会在对象一章中重点介绍。[*]Boolean类,Number类,String类,RegExp类,Date类,Array类,Function类
//转换引用类型的误区 var oBoolean=new Boolean(false); var oNumber=new Number(0); alert(Boolean(oBoolean)); alert(Boolean(oNumber));在不推荐使用上述三个引用类型时,有人会怀疑,这样岂不是不能使用类提供的丰富的方法。但其实,除了null和undefined,其他三种原始类型其实都是伪对象。也就是说,一个存储原始值的变量,同样可以使用对应的类的方法,甚至,即使是字面量也可以直接使用这些方法,但它本身依旧是原始类型。
//伪对象的方法 var int=4; var str=‘abcd’; alert(int.toString(8)+‘ ’+(4).toString(16)); alert(typeof int); alert(str.toUpperCase()+ ‘ ’+ ‘EFGH’.toLowerCase()); alert(typeof str);另外,对于Object类、RegExp类、Array类,Function类,也是可以通过字面量来直接定义的,而不需要使用new关键字来创建,但是,它们依旧是引用类型。为了提高效率,建议尽量用字面量来直接定义。
var oObject={}; var oRegExp=/\d/ig; var oArray=[]; var oFunction=function() {};js的类型暂时先说到这里,其实,还有一个重要的类型没讲,就是函数。函数在js里是“一级”对象。关于的函数的知识将另起一篇讲述。
[[italic] 本帖最后由 渚薰 于 2007-12-10 08:51 编辑 [/italic]]