二 数据、变量、内存
数据
存储在内存中代表特定的信息,本质上是0101…
可传递,可运算
var a = 3
var b = a + 2
内存中所有操作的目标全都是数据:算数运算、逻辑运算、赋值运算、运行函数
内存
可临时储存数据的空间
内存分类
- 栈:全局变量/局部变量
- 堆:对象
变量
可变化的量,由变量名和变量值组成,每个变量都对应一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
内存、数据、变量三者关系
- 内存用来存储数据的空间
- 变量是内存的标识
问题思考
var a = xxx,a内存中保存的是什么 ?
- 当xxx是基本数据:保存的就是这个数据
- 当xxx是对象:保存的是对象的地址值
- 当xxx是变量:保存的xxx的内存内容(基本数据/地址值)
引用变量赋值
- 改变属性
var obj1 ={ name: 'Tom' }
var obj2 = obj1
obj1.name = 'Jack'
console.log(obj2.name) // Jack, obj1 与 obj2 两个引用变量指向同一个对象
- 改变地址
var obj1 ={ age: 18 }
var obj2 = obj1
obj1 ={ age: 20 }
console.log(obj1.age, obj2.age) // 20,18 ,obj1指向 age = 20 的对象,obj2指向 age = 18 的对象
引用变量传递
- 改变属性
var obj1 = { age: 18 }
var obj2 = obj1
function fun(obj) {
obj.age = 20
}
fun(obj1)
console.log(obj1.age, obj2.age) // 20,20
// 变量 obj1、obj2 指向的对象地址没变,改变了对象中的属性
- 改变地址
var obj1 = { age: 18 }
var obj2 = obj1
function fun(obj) {
obj = { age: 20 }
}
fun(obj1)
console.log(obj1.age, obj2.age) // 18, 18
// 变量 obj 重新指向 { age: 20 }
// 变量 obj1、obj2 仍指向 { age: 18 }