文章目录
1. 什么是数据?
- 存储在内存中代表特定信息的介质,本质上是0101…
- 数据的特点:可传递,可运算
- 一切皆数据
- 内存中所有操作的目标:数据
- 可进行的数据操作:
- 算术运算
- 逻辑运算
- 赋值
- 运行函数
2. 什么是内存?
- 内存条通电后产生的可储存数据的空间(临时的)
- 内存产生和死亡:
内存条(电路板) ==>通电 ==>产生内存空间==>存储数据==>处理数据==>断电==>内存空间和数据都消失 - 一块小内存的2个数据
- 内部存储的数据
- 内存对应的地址值
- 内存分类
- 栈:存储全局变量/局部变量
- 堆:存储对象(不包含数组和函数)
对象内部的变量、函数、数组自然也存储在堆空间。但是对象名存储在栈空间。
3. 什么是变量?
- 可变化的量,由变量名和变量值组成
- 每个变量都对应的一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
4.内存、数据、变量三者之间的关系
- 内存用来存储数据的空间
- 变量是内存的标识
问题
变量的赋值
- 问题: var a = XXX,a内存中到底保存的是什么?
- XXX是基本数据,保存的就是这个数据
- XXX是对象,保存的是对象的地址值
- XXX是一个变量,保存的XXX的内存内容(可能是基本数据,也可能是地址值)
var a =3;
a = function(){
}
var b = 'abc'
a = b
引用变量的赋值
- 如果使用一个引用变量给另一个引用变量赋值,eg:
obj2 = obj1
,那么这两个变量指向的是同一个对象。
var obj1 = {name:'Tom'}
var obj2 = obj1
obj2.name = 'Jack'
console.log(obj1.name)
输出:
Jack
- 如果在给引用变量赋新的对象地址,则这两个引用变量就指向不同的对象,互不干扰。
var obj1 = {name:'Tom'}
var obj2 = obj1
obj1 ={ name:'jack',
age:18}
console.log(obj1.name)
console.log(obj2.name)
eg2:
var a ={age:12}
var b = a
a={name:'Bob',age:13}
b.age = 14
function fun(obj){
obj = {age:15}
}
fun(a)
console.log(a.age)
输出:
因为 obj = {age:15}新建了一个对象,但是函数执行完成之后,局部变量被释放所以{age:15}就成了一个垃圾对象,之后会被清除,根本不会影响到a。
在js调用函数时传递变量参数时是值传递
一种是直接传递基本值,一种是传递地址值,但是都是将变量对应的值传递给局部变量,所以说调用函数时传递变量参数时是值传递。
但是不同的是,传递基本值,就不能通过基本值访问堆空间,就无法进行改变。只能通过return将结果返回调用函数。
传递地址值,可以利用基本值访问堆空间,就可以直接改变该地址指向的对象。
eg:传递基本值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
var a =10
function add1(a){
a=a+10
}
add1(a)
console.log(a)
function add2(b){
a = b+10
}
add2(a)
console.log(a)
</script>
</body>
</html>
eg:传递地址值
function fun(obj){
obj.name='Jack'
}
var obj ={name:'Tom'}
fun(obj)
console.log(obj.name)
输出:
JS管理内存
内存生命周期
- 分配小内存空间,得到它的使用权
- 存储数据,可以反复进行操作
- 释放内存空间
释放内存
局部
变量:函数执行完自动释放
(全局变量不会随便释放)- 对象:成为垃圾对象==>垃圾回收器回收
eg:
function fun(){
var obj ={}
}
fun()
函数执行完毕之后obj
立即释放,而对象 {}
等待垃圾回收器进行回收。