基本类型和引用类型:
ECMAScript包含两个不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。
基本数据类型
- 常见的基本数据类型
Number、String 、Boolean、Null和Undefined。这五种基本数据类型是按值访问的,可以直接操作保存在变量中的实际值
var a = 10;
var b = a;
b = 20;
console.log(a); // 10
b获取的是a值得一份拷贝,虽然,两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。
b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。
- 引用类型数据
对象类型Object type,比如:Object 、Array 、Function 、Data等。
javascript引用数据类型是保存在堆内存中的对象,与其它语言不同的是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能通过操作对象的在栈内存中的引用地址。所以引用类型的数据,在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存在堆内存中的对象。
var aa = {name:'张三'};
var bb = aa;
bb.name = '李四';
console.log(aa); // {name: "李四"}
这两个引用数据类型指向了同一个堆内存对象,aa赋值给bb,实际上这个堆内存对象在栈内存的引用地址复制了一份给了bb;但是实际上他们共同指向了同一个堆内存对象。实际上改变的是堆内存对象。
给aa添加name属性,实际上是给堆内存中的对象添加了name属性,aa赋值给bb,bb改变了name值,因为bb和aa指向的是同一个堆内存对象,所以bb的改变会引起aa的改变。