标题:[博客原创转载]javascript经验谈之一--理解js的类型
取消只看楼主
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
 问题点数:0 回复次数:1 
[博客原创转载]javascript经验谈之一--理解js的类型
Traceback(博客原文地址):[url=http://www.]http://www.[/url]

         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类
        在使用这些类的时候必须特别小心,因为,用new关键字创建的,都属于对象类型。在“转换”一节提到过,任何引用类型,转换成Boolean型都将是 true。所以,应该尽量避免使用Boolean,Number,String类,而直接使用他们的原始值。
程序代码:
 
//转换引用类型的误区  
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]]
搜索更多相关主题的帖子: 博客 经验谈 javascript 类型 
2007-12-07 17:18
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
得分:0 
本身字面的数字量,比如4不能使用点语法访问对象的属性
在4外面加括号,就成为了“对象”,可以用点语法来访问
字符串则不需要,比如'4'.length
这只是解释器的语法规则。

个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2007-12-10 08:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-191028-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064423 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved