JS有两种变量类型:
1.基本数据类型:
- null
- undefined
- string
- number
- boolean
3.引用(对象)类型:
- function
- array
- object
这两种变量类型在内存中的存储区别非常大。
两种变量类型的存储:
- 变量是基本类型:变量保存的值就是数据。
- 变量是引用类型:变量保存的值是地址值。
注意:全局、局部变量都是存储在栈中,而对象是存储在堆中(对象包括数组、函数)。
正由图所示那样,基本类型变量,其变量与值都是存在栈中,而引用类型是在栈中存了变量名和一个指向堆中存放数据的地址。
注意
:引用类型的变量给另一个变量赋值或传参时,实际是给另一个变量赋值地址值,即让另一个变量也指向它所指的堆
中的数据。
示例:
let obj={
name:'鸭绒'
}
let obj1=obj;
上面的赋值操作实际如图所示:
正如红色部分指针,obj的值是一个地址值,指向了堆中的数据。
下面看看引用变量的赋值问题:
思考1
:假如有两个变量指向同一个对象,通过一个变量修改对象内部的数据,那另一个对象内部数据会改变吗?
var obj = {
name: '鸭绒',
age: 18,
}
var obj1 = obj
obj1.name = '唐老鸭'
obj1.age = 23
console.log(obj, obj1)
答案是会变的,因为它们指向堆中的同一数据,当堆中的数据被一个变量修改后,另一个变量再读取数据是修改后的数据。
思考2:
假如有两个引用变量指向同一个对象,后来让其中一个引用变量指向了另一个对象,那他们修改数据,还会相互影响吗?
示例:
var obj = {
name: '鸭绒',
age: 18,
}
var obj1 = obj;//此时两个变量指向同一个对象
//让obj指向另一个对象
obj={
name:'唐老鸭',
sex:'男',
}
obj1.name='姜葱鸡'
console.log(obj,obj1)
obj后来指向了另一个对象,则obj、obj1指向的不是堆中同一个数据,故修改数据不再相互影响。
图表说明:
obj修改了指向。