(二)引用类型。
2019-02-27 本文已影响0人
萘小蒽
可以这么说,变量上除了基本类型(number,string,blooean,undefined,null),其他都是引用类型了,也可以叫对象,它是属性和方法的集合。也就是说引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型。
引用类型的特点:
- 引用类型的值是可变的。
我们可为为引用类型添加属性和方法,也可以删除其属性和方法,如:
var person = {};//创建个控对象 --引用类型
person.name = 'yujiadong';
person.age = 25;
person.sayName = function(){console.log(person.name);}
person.sayName();// 'yujiadong'
delete person.name; //删除person对象的name属性
person.sayName(); // undefined
上面可以看出引用类型可以拥有属性和方法,而且是可以动态改变的。
- 引用类型的值是保存在栈内存和堆内存中的对象。
确切的说,引用类型的存储需要内存的栈区和堆区共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。
假如有以下几个对象:
var person1 = {name:'jozo'};
var person2 = {name:'xiaom'};
var person3 = {name:'xiaoq'};
则这三个对象的在内存中保存的情况如下图:
![](https://img.haomeiwen.com/i10987163/33da2e62af8d81e3.png)
- 引用类型的比较是引用的比较。
var person1 = '{}';
var person2 = '{}';
console.log(person1 == person2); // true
var person1 = {};
var person2 = {};
console.log(person1 ==person2)//false
上面字符串比较是值的比较, 但是引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同。
那很明显,person1和person2在堆内存中地址是不同的:
![](https://img.haomeiwen.com/i10987163/12e5c9f4e28bf7bc.png)
- 对象引用(浅拷贝)
当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面前端基础(一)讲引用类型的时候提到,
保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,
两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响:
var a = {};
var b = a ;
a.age = 25;
console.log(a.age) // 25
console.log(b.age) // 25
b,name = ‘yujiadong’;
console.log(a.name) //yujiadong
console.log(b.name) //yujiadong
console.log(a == b) //true
两个变量如下图:
![](https://img.haomeiwen.com/i10987163/a571c0acc4c5dbb3.png)
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响,这也叫浅拷贝。