JavaScript中的类型与变量

来源:互联网 发布:网络用语 胡萝卜 编辑:程序博客网 时间:2024/06/06 06:38

简介

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。

5种基本数据类型

string/number/boolean/null/undefined
这5种基本数据类型之外的都被称为Object类型。Object本质上是由一组无序的名值对组成的。
数字、字符串和布尔值为一般的原始类型,而null(空)和undefined(未定义)则相对较为特殊,通常分别代表了各自特殊类型的唯一的成员。而且这两种类型都不能使用方法(没有对应的包装类型)。

基本类型是按值访问的,可以操作保存在变量中的实际的值,而引用类型的值则是保存在内存中的对象。对于一个引用类型,我们可以为其中添加属性,也可以删除属性,但基本类型则不可以。
当然,具体地讲,为基本类型添加属性时,实际上是添加到“添加动作”过程中自动创建的包装类对象中,但这个包装类对象在“添加动作”结束时就注销了,所以“添加动作”完成后基本类型变量还是那个变量,没有任何变化。

进行变量复制时,基本类型与引用类型的效果也不相同,如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。

要检测一个变量是不是基本数据类型,typeof操作符是最佳的工具。typeof操作符是确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具。如果变量的值是一个对象或null,则typeof操作符会返回"object"。
如果要检测引用类型,则可以使用instanceof操作符。
var a = [1, 2, 3];var b = new Object();print(a instanceof Array);    // trueprint(b instanceof Array);    // false


注意,如果变量是基本类型,则instanceof运算总是返回false。

在进行typeof操作时,null会返回Object,但 "null instanceof Object" 却返回false:
print(typeof null);                   // objectprint(null instanceof Object);        // false


包装类型

为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean、Number和String。这些类型具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
一般情况下不应该显式创建这些包装类型对象,因为对基本包装类型的实例调用typeof会返回"object",而且所有基本包装类型的对象在转换为布尔类型时值都是true。
此外,还可以通过Object构造函数来得到包装类型对象,Object()构造函数会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。也就是说,可能通过new Object(...)来创建包装类型,而且根据传给Object的参数的不同而得到不同的包装类型。
var a = new Object(3);print(typeof a);                   // objectprint(a instanceof Number);        // true



原创粉丝点击