什么是数据?

  • 存储于内存中代表特定信息的’东东’, 本质就是0101二进制
  • 具有可读和可传递的基本特性
  • 万物(一切)皆数据, 函数也是数据
  • 程序中所有操作的目标: 数据
    • 算术运算
    • 逻辑运算
    • 赋值
    • 调用函数传参

什么是内存?

  • 内存条通电后产生的存储空间(临时的)
  • 产生和死亡: 内存条(集成电路板)>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失
  • 内存的空间是临时的, 而硬盘的空间是持久的
  • 一块内存包含2个数据
    • 内部存储的数据(一般数据/地址数据)
    • 内存地址值数据
  • 内存分类
    • 栈: 全局变量, 局部变量 (空间较小)
    • 堆: 对象 (空间较大)

什么是变量?

  • 值可以变化的量, 由变量名与变量值组成
  • 一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存的内容

内存,数据, 变量三者之间的关系

  • 内存是一个容器, 用来存储程序运行需要操作的数据
  • 变量是内存的标识, 我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据

    问题说明

问题: var a = xxx, a内存中到底保存的是什么?

  • xxx是一个基本数据
  • xxx是一个对象
  • xxx是一个变量

关于引用变量赋值问题

  • 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见
  • 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象

    1. //1. 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见
    2. var obj1 = {}
    3. var obj2 = obj1
    4. obj2.name = 'Tom'
    5. console.log(obj1.name) // Tom
    6. function f1(obj) {
    7. obj.age = 12
    8. }
    9. f1(obj2)
    10. console.log(obj1.age) // 12
    11. //2. 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象
    12. var obj3 = {name: 'Tom'}
    13. var obj4 = obj3
    14. obj3 = {name: 'JACK'}
    15. console.log(obj4.name) // Tom
    16. function f2(obj) {
    17. obj = {name: 'Bob'}
    18. }
    19. f2(obj4)
    20. console.log(obj4.name) // Tom

    问题: 在js调用函数时传递变量参数时, 是值传递还是引用传递

  • 只有值传递, 没有引用传递, 传递的都是变量的值, 只是这个值可能是基本数据, 也可能是地址(引用)数据

  • 如果后一种看成是引用传递, 那就值传递和引用传递都可以有

    1. function f(a) {
    2. console.log(a)
    3. }
    4. var n = 4
    5. f(n) //传递的是n的值 --->值传递
    6. function f2(a) {
    7. a.name = 'atguigu'
    8. }
    9. n = {}
    10. f2(n) // 传递的是n指向的对象 ---> 引用传递 ???
    11. console.log(n.name)

    问题: JS引擎如何管理内存?

  1. 内存生命周期
    1). 分配需要的内存
    2). 使用分配到的内存
    3). 不需要时将其释放/归还
  2. 释放内存
  • 为执行函数分配的栈空间内存: 函数执行完自动释放
  • 存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存
  1. var obj = {}
  2. obj = null // {}没有引用指向,成为垃圾对象
  3. function fn () {
  4. var a = 3
  5. var b = {}
  6. }
  7. fn() // b 是自动释放,b所指向的对象是在后面的某个时刻由垃圾回收器回收