ECMAScript 变量可能包含两种不同数据类型的值:
基本类型值和引用类型值
基本类型值和引用类型值
基本类型值指的是保存在栈内存的简单的数据段,即这种值完全保存在内存中的一个位置。而引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
基本类型是按值访问的。
引用类型的值,由于这种值的大小不固定,因此不能把它们保存到栈内存中。(大小固定)但内存地址的大小事固定的,因此可以将内存地址保存在栈内存中。当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
动态属性
定义基本类型值和引用类型值得方式是相似的;创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。
var box=new Object(); //创建引用类型
box.name='Lee';//新增一个属性
alert(box.name);//"Lee"
如果是基本类型的值添加属性
var box="Lee";
box.age=27;
alert(box.age);//undefined
这说明:只能给引用类型值动态地添加属性
复制变量值
基本类型值:会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。(复制的是值本身)
var num1=5;
var num2=num1;
引用类型值:同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。(复制的是地址)
var obj1=new Object();
var obj2=obj1;
obj1.name="Lee";
alert(obj2.name);//'Lee'
传递参数(按值传递)
function setName(obj){
obj.name="Lee";
obj=new Object();
obj.name="Greg";
}
var person =new Object();
setName(person);
alert(person.name);//"Lee"
如果person 是按引用传递的,那么person就会自动被修改为指向其name属性值为“Greg”的新对象。但是没有,这说明即使在函数内部修改了参数的
值,但原始的饮用仍然保持未变。
检测类型
typeof 检测基本类型
instanceof()检测引用类型