Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3351588
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类:

2008-07-30 09:11:03

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运算符。

 

JavaScript代码
  1. var int=1;  
  2. var str=‘1′;  
  3. var bool=true;  
  4. var undef;  
  5. var anymous=null;  
  6. alert(typeof int);
  7. alert(typeof str);  
  8. alert(typeof true);  
  9. alert(typeof undef);  
  10. alert(typeof anymous);  

        在上面的运算中,要注意的是,typeof null返回的是object。这个是早期JavaScript中的一个Bug。最后还是被ECMAScript沿用了。但是,在ECMAScript 3rd的规范文档中,已经把null表述成了对象,所以typeof返回object是正确的。

类型转换

        ECMAScript提供两种简单转换,分别是转换成字符串和转换成数字。实际上ECMAScript的所有类型(包括对象)都内建了一个 toString()方法(原始类型其实是伪对象,下面会阐明),该方法就是把当前值按合适的方式转换成字符串。5个原始类型都将被转换成相同字面的字符 串。而对于对象,又分为宿主对象和本地对象。本地对象本身已经实现了内在的toString()方法,而宿主对象可以由开发者自行创建toString方 法。另外,在字符串连接操作中,所有对象或类型都会自动调用toString()对象。

JavaScript代码
  1. alert(‘this is a number: ’+1+‘\nthis is a boolean: ’true +‘\nthis is a null: ’null + ‘\nthis is a undefined: ’+undefined);  

        当要转换成数字时,可以使用parseInt和parseFloat。这两个全局函数,会把字符串中第一个无效字符前的字符串转换成数字类型。当无法完成这样的转换时,函数将返回一个特殊值“NaN”。例如:

JavaScript代码
  1. alert(parseInt(‘1234abcd’));  
  2. alert(parseInt(‘22.5′));  
  3. 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型。规则如 下(见示例):

JavaScript代码
  1. /*Boolean类型,转换后不变*/  
  2. alert(‘true:’+Boolean(true));  
  3. alert(‘false:’+Boolean(false));  
  4. /*数字类型,0为false,非0为true*/  
  5. alert(‘0:’+Boolean(0));  
  6. alert(‘4:’+Boolean(4));  
  7. /*字符串类型,空串为false,其他为true*/  
  8. alert(‘"":’+Boolean());  
  9. alert(‘"abcd":’+Boolean(‘abcd’));  
  10. /*undefined和null,为false*/  
  11. alert(‘undefined:’+Boolean(undefined));  
  12. alert(‘null:’+Boolean(null));  
  13. /*所有引用类型,都为true*/  
  14. alert(‘Object:’+Boolean(new Object()));  
引用类型

         ECMAScript除了原始类型,还有引用类型。引用类型也通常叫做类。但ECMAScript实际上是没有类这个概念的。它仅仅只能称作对象。类的实 例化用new关键字来创建。例如var o = new Object();ECMAScript中的类分别有:

  1. Object类是其他所有类的基类,Object类中的所有属性和方法都会出现在其他类中。对于Object类,会在对象一章中重点介绍。
  2. Boolean类,Number类,String类,RegExp类,Date类,Array类,Function类

        在使用这些类的时候必须特别小心,因为,用new关键字创建的,都属于对象类型。在“转换”一节提到过,任何引用类型,转换成Boolean型都将是 true。所以,应该尽量避免使用Boolean,Number,String类,而直接使用他们的原始值。

JavaScript代码
  1. //转换引用类型的误区  
  2. var oBoolean=new Boolean(false);  
  3. var oNumber=new Number(0);  
  4. alert(Boolean(oBoolean));  
  5. alert(Boolean(oNumber));  

        在不推荐使用上述三个引用类型时,有人会怀疑,这样岂不是不能使用类提供的丰富的方法。但其实,除了null和undefined,其他三种原始类型其实 都是伪对象。也就是说,一个存储原始值的变量,同样可以使用对应的类的方法,甚至,即使是字面量也可以直接使用这些方法,但它本身依旧是原始类型。

JavaScript代码
  1. //伪对象的方法  
  2. var int=4;  
  3. var str=‘abcd’;  
  4. alert(int.toString(8)+‘ ’+(4).toString(16));  
  5. alert(typeof int);  
  6. alert(str.toUpperCase()+ ‘ ’‘EFGH’.toLowerCase());  
  7. alert(typeof str);  

        另外,对于Object类、RegExp类、Array类,Function类,也是可以通过字面量来直接定义的,而不需要使用new关键字来创建,但是,它们依旧是引用类型。为了提高效率,建议尽量用字面量来直接定义类。

JavaScript代码
  1. var oObject={};  
  2. var oRegExp=/\d/ig;  
  3. var oArray=[];  
  4. var oFunction=function() {}  

      js的类型暂时先说到这里,其实,还有一个重要的类型没讲,就是函数。函数在js里是“一级”对象。关于的函数的知识将另起一篇讲述。

阅读(2280) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~