什么是数据?
- 存储在内存中代表特定信息的'东东', 本质上是0101...
- 数据的特点: 可传递, 可运算
- 一切皆数据
- 内存中所有操作的目标: 数据
-
- 算术运算
- 逻辑运算
- 赋值
- 运行函数
什么是内存?
- 内存条通电后产生的可储存数据的空间(临时的)
- 内存产生和死亡: 内存条(电路版)==>通电==>产生内存空间==>存储数据==>处理数据==>断电==>内存空间和数据都消失
- 一块小内存的2个数据
-
- 内部存储的数据
- 地址值
- 内存分类
-
- 栈: 全局变量/局部变量
- 堆: 对象
什么是变量?
- 可变化的量, 由变量名和变量值组成
- 每个变量都对应的一块小内存, 变量名用来查找对应的内存, 变量值就是内存中保存的数据
内存,数据,变量之间的关系
- 内存用来存储数据的空间
- 变量是内存的标识,我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据。
- 写:
a= - 读:
=a,a(),a.,test(a),a[]
数据_变量_内存相关问题
var a = xxx, a内存中到底保存的是什么?
- xxx是基本数据, 保存的就是这个数据
- xxx是对象, 保存的是对象的地址值
- xxx是一个变量, 保存的xxx的内存内容(可能是基本数据, 也可能是地址值)
注意:js是弱类型的,即数据类型可以被忽略,一个变量可以赋不同数据类型的值(变量结果以值为导向)
var a = 3
a = function () {}
var b = 'abc'
a = b
b = {}
a = b
console.log(a,b) // {},{}
关于引用变量赋值问题
- 2个引用变量指向同一个对象, 通过一个变量修改对象内部数据, 另一个变量看到的是修改之后的数据
- 2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一引用变量依然指向前一个对象
var obj1 = {name: 'Tom'}
var obj2 = obj1
obj2.age = 12
console.log(obj1.age) // 12
function fn (obj) {
obj.name = 'A'
}
fn(obj1)
console.log(obj2.name) //A
var a = {age: 12}
var b = a
a = {name: 'BOB', age: 13}
b.age = 14
console.log(b.age, a.name, a.age) // 14 BoB 13
function fn2 (obj) {
obj = {age: 15}
//首先obj和对象a都指向{name: 'BOB', age: 13}
//之后obj指向新对象{age: 15}
//函数执行完毕,变量obj被释放
//{age: 15}变成垃圾对象
}
fn2(a)
console.log(a.age)//13
a.age中的.什么作用?通过a找到它所对应的内存的对象,接着找到对象age属性的值。所以说,要想a最后不变化,两个条件:
- a不变。
- 不修改a指向的对象的内容。
在js调用函数时传递变量参数时, 是值传递还是引用传递
- 理解1: 都是值(基本值/地址值)传递
- 理解2: 可能是值传递, 也可能是引用传递(地址值)
var a = 3
function fn (a) {
a = a +1
}
fn(a)
console.log(a)//3
function fn2 (obj) {
console.log(obj.name)
}
var obj = {name: 'Tom'}
fn2(obj)
JS引擎如何管理内存?
- 内存生命周期
-
- 分配小内存空间, 得到它的使用权
- 存储数据, 可以反复进行操作
- 释放小内存空间
- 释放内存
-
- 局部变量: 函数执行完自动释放
- 对象: 成为垃圾对象==>垃圾回收器回收
var a = 3
var obj = {}
obj = undefined
function fn () {
var b = {}
}
fn() // b是自动释放, b所指向的对象是在后面的某个时刻由垃圾回收器回收