JavaScript中变量的类型及其比较

来源:互联网 发布:ubuntu怎么启动wifi 编辑:程序博客网 时间:2024/05/22 14:03

原创文章,转载请注明出处,谢谢!

http://blog.csdn.net/chang_yuan_2011/article/details/7897957      

         在JavaScript中变量包含两种不同数据类型的值,一种是基本类型值,一种是引用类型值。基本类型值是指那种数据值可以完全保存在栈内存中的简单数据片段,包括Undefined,Null,String,Boolean和Number,因为这些数据类型的值在内存中所占空间大小是固定的,而引用类型值都是Object的实例,包括Object,Array等等,这些值由于大小不固定所以先保存在堆内存中,然后将保存这些对象的内存地址保存到栈内存中,因为内存地址的大小固定的。

        所以我们对于那些基本类型值的操作是按值访问,就是我们每次操作的都是它们实际保存的值,对于那些引用类型的值的操作是按引用访问,我们操作的不是那个实际的值,而是被那个值引用的对象。

       小结一下:基本类型与引用类型的区别就是在栈内存中到底存储的是它真实的值还是它的引用。

       那么基本类型与引用类型的值除了在内存中存储的方式不同,还有一些其他的什么差异呢?

      1、引用类型的值我们可以给它添加动态属性和方法,也可以改变、删除其属性和方法,但是不可以给基本类型的值添加属性,例如:

var person = new Object( );person.name = "xiaochang";alert(person.name); //xiaochangvar person = "xiaochang";person.age= 23;alert(person.age);//undefined

可能有些人会有疑问说,那为什么我们可以获取person.length的值,基本类型的值不是没有属性的吗?

这是因为在读取一个基本类型的值时,后来会创建一个对应的基本包装类型(在JavaScript中基本包装类型包括String,Number,Boolean)的对象,从而让我们可以调用一些方法来操作这些数据。例如:

var person = “xiaochang";var len = person.length;alert(len);

当第二行访问person时,访问过程处于一种读取模式,也就是在栈内存中读取这个值。而在读取模式中访问内存,后台会自动完成以下处理:

a. 创建String类型的一个实例;

b. 在实例上调用length方法;

c. 销毁实例;
这也是基本包装类型与引用类型的区别:生命周期不同。引用类型是一直保存子在内存中,直到执行流离开当前作用域,基本包装类型是在代码执行瞬间存在然后就销毁,说到这里大家应该也就清楚person.age = 23 ,alert(person.age) //undefined 的原因了吧。

第一步:执行person.age = 23时后台执行以下处理

a. 创建了一个基本包装类型的对象;

b. 给它增加属性age,赋值为23;

c. 然后销毁对象;

第二步:执行alert(person.age )时后台执行以下处理

a. 创建了一个基本包装类型的对象;

b. 读取它的属性age;(很明显该属性不存在,所以是undefined)

c. 然后销毁对象;


      2、若变量的值是基本类型的值,那么在复制变量过程中会在栈内存中创建一个新值,然后把值复制到为新变量分配的位置上。若变量的值是引用类型的值,那么在复制变量过程中会在栈内存中创建一个新的引用,新创建的引用与被复制的引用指向的是同一个对象,然后把引用复制到为新变量分配的位置上。
所以变量值为基本类型无论复制多少,彼此之间是相互独立的,对任意一个做改变,对其他的一点影响都没有;但是变量的值是引用类型的,复制完就相当于给房间配多了几把钥匙,用第一把钥匙打开房间的门把里面的沙发位置移动了,用其他几把钥匙打开房间的门也会看到房间的变化。

       知道了基本类型值与引用类型值的区别后,我们来看看如何让判断该变量值属于什么类型?在JavaScript有两个操作符可以完成这项伟大的任务:

      1.typeof:可以用来确定一个变量的数据类型

      2.instanceof:可以用来确定一个引用类型值的是什么类型的对象


  3、我们可以显式调用Boolean、Number和String来创建基本包装类型的对象,对基本包装类型的实例调用typeof会返回"object",而且所有的基本包装类型的对象都会被转换为布尔值true。需要注意的是,使用new调用基本包装类型的构造函数,与直接调用同名的转型函数是不一样的。

<span style="font-size:14px;">var value = "25";var number=Number(value);alert(typeof number);  //“number”var obj= new Number(value);alert(typeof obj);  //“Object”</span>


我们也可以直接调用Object构造函数创建实例,Object构造函数会根据传入值的类型返回相应基本包装类型的实例。
<span style="font-size:14px;">var numObj = new Object(123);alert(numObj instanceof Number); //truevar strObj = new Object("123");alert(strObj instanceof String); //true</span>


原创粉丝点击