初学JS语言的朋友们会学习到关于变量的类型问题,变量一般可分为原始类型的变量和引用类型的变量,两者的存放方式自然是截然不同的,那么具体的区别是说明呢?具体如下:
一、原始类型的变量
原始类型的数据这里无需多说,例如:
var a = 123,
b = 456;
其数据的存放方式大体如下图:
就是在栈内存(stack)中申请一块空间,存储数据内容。打一个不恰当的比喻,就好比去酒店开好房间后直接将要存放的东西放入房间中,这种变量的声明与赋值理解起来很简单,我们称之为原始类型的变量。数字、字符串、布尔型数据均可直接赋值为此类变量。
二、引用类型的变量
引用类型的变量一般涉及到数组、对象的声明赋值,以对象声明为例:
var user1 = {
name:'Mago',
sex:'male',
add:{
country:'China',
city:'shanghai'
}
};
var user2 = {
name:'Mago',
sex:'female',
add:{
country:'China',
city:'beijing'
}
}
其数据的存放方式大体如下图:
同样是在栈内存(stack)中申请了两块空间,但存放的数据并非对象本身,而是存放在堆内存(heap)中申请的空间的地址;与此类似,对象中存在对象时同理。
这里需要注意的是,如相互赋值,结果如下:
var user1 = {
name:'Mago',
sex:'male',
add:{
country:'China',
city:'shanghai'
}
};
var user2 = {
name:'Mago',
sex:'female',
add:{
country:'China',
city:'beijing'
}
};
user2 = user1;
这样如将user1、user2两者任意之一对象的内容更改,另一个在访问的过程中,访问到的内容也会是更改后的内容,因为两者实际上指向的地址是同一块堆内存。
为了进一步理解,我们做出进行以下调整,存放的数据又会有所改动:
var user1 = {
name: 'Mago',
sex: 'male',
add: {
country: 'China',
city: 'shanghai'
}
};
var user2 = {
name: 'Mago',
sex: 'female',
add: {
country: 'China',
city: 'beijing'
}
};
user2.sex = user1.sex;
user2.add = user1.add;
user2.add.country = 'USA';
此时user2的name、sex属性都已改变为user1的name、sex的值,但是值得关注的是,user2的add属性因为是一个引用类型的变量,因此地址会改变为user1的add的地址,这样一来,user2与user1中任一add属性发生变化,二者都会有所改动。这就是引用类型的变量内存地址指向问题。
三、拓展知识
JS中的垃圾回收
垃圾回收器,会定期的发现内存中无法访问到的对象,该对象称之为垃圾,垃圾回收器会在合适的时间将其占用的内存释放。
此文源于本人一点知识积累,仍处于学习阶段,有不足之处还请指出交流,谢谢!