**
ES变量中包含两种数据类型的值
**
基本数据类型值:指的是简单的数据段
引用数据类型值:指的可能由多个值构成的对象
(注:将值赋给变量时,解析器必须确认值是哪种类型值)
基本数据类型值:5种。Undefined、Null、Boolean、Number、String
引用数据类型值:8种。Object、Array、Date、RegExp、Function和三种特殊引用类型Boolean、Number和String。
两者区别
1.访问
2.保存&添加属性
3.复制变量值
4.传递参数
5.回收
1.访问
5种基本数据类型是按值访问的,可以操作保存在变量中的实际值。
引用类型的值是保存在内存中的对象,JS不允许直接访问内存中的位置。操作对象时,实际上在操作对象的引用。引用类型的值是按引用访问的。
2.保存&添加属性
基本类型的值存在栈内存
引用类型的值存在堆内存 只能给引用类型值动态添加属性和方法
var person = new Object();
person.name = BTS;
alert(person.name); //"BTS"
var name = "BTS";
name.age = 5;
alert(name.age); //undefined
3.复制变量值
复制基本类型的值,在变量对象上创建一个新值,把该值复制到这个新变量。两变量可参与操作而不会互相影响。
复制引用类型的值,同样会复制值,但值得副本是一个指针,这个指针指向存储在堆中的一个对象。复制操作结束后,两变量将引用同一个对象,会相互影响。
4.传递参数
ES中所有函数的参数都按值传递。
向参数传递基本类型的值时,被传递的值会复制给一个局部变量。(命名参数,arguments对象中的一元素)
function addnum(num){
num += 10;
return num;
}
var count = 20;
var result = addnum(num);
alert(count); //20,没有变化
alert(result); //30
num与count互不认识,只是有了相同的值,若按引用传递的话,count也会变为30
向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,局部变量的变化反映在函数外部。
function setname(obj){
obj.name = "BTS";
obj = new Object(); //这个变量引用的是一个局部对象,这个局部对象在函数执行完后被销毁
obj.name = "EXO";
}
var person = new Object();
setname(person);
alert(person.name); //"BTS"
person是按值来传递的,如果不是,最后值应该是EXO。
5.回收
基本类型在当前执行环境结束后销毁。
引用类型不随执行环境结束而销毁,只当引用它的变量不存在时,这个对象才被垃圾回收机制回收。