标签:
一、引言
ECMAScript包含两个不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。(《javascript高级程序设计(第3版)》)
二、基本类型值和引用类型值
(1)基本类型值
包括Undefined、Null、Boolean、Number和String.这5种基本数据类型是按值访问的,操作保存在变量中的实际的值。
例子:
var aa = 10; var bb =aa; console.log(aa); //10 console.log(bb); //10 bb=11; console.log(aa); //10 console.log(bb); //11
上面的例子,bb获取值是aa值的一份拷贝,虽然,两个变量的值是相等,但是两个变量分别保存了一份基本数据类型值,完全是独立的。所以,当bb的值改变时,aa的值依然是10;
演示:
(2)引用类型值
包括Function、Object、Array。引用类型变量的复制:复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象。
例子:
var a=[1,2,3]; var b=a; alert(b);//1,2,3 a[0]=100; alert(b); //100,2,3
对象是存放在内存中的堆。上面的例子,b是a的一份拷贝,而a和b其实是存储在栈中的地址,指向数组对象的地址,复制操作结束后,a,b两个变量实际上将引用同一个对象,因此改变其中的一个,将影响另一个。
演示:
三、类型检测
typeof 可以检测出Undefined、Null、Boolean、Number、String和Object。但是却无法检测出是否是array,那么还有一个检测方法 instanceof。
var s = ‘hello‘; var n =1; var u; var b =true; var nu=null; var o =new object(); var a = new Array(); console.log(typeof s); //string console.log(typeof n); //number console.log(typeof u); //undefine console.log(typeof b); //boolean console.log(typeof nu); //object console.log(typeof o); //object console.log(typeof a); //object console.log(o instanceof Object); //true console.log(a instanceof Array); //true console.log(o instanceof RegExp); //false
四、问题
那么对于引用类型的数据,该怎么备份?难道把数组变为基本类型,这个问题我暂时没有找到答案。
标签:
原文地址:http://www.cnblogs.com/helloparty/p/4629386.html