数据、内存与变量

221 阅读3分钟

什么是数据?

  • 存储在内存中代表特定信息的'东东', 本质上是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.agea.namea.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最后不变化,两个条件:

  1. a不变。
  2. 不修改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引擎如何管理内存?

  1. 内存生命周期
    • 分配小内存空间, 得到它的使用权
    • 存储数据, 可以反复进行操作
    • 释放小内存空间
  2. 释放内存
    • 局部变量: 函数执行完自动释放
    • 对象: 成为垃圾对象==>垃圾回收器回收
var a = 3
var obj = {}
obj = undefined

function fn () {
  var b = {}
}
fn() // b是自动释放, b所指向的对象是在后面的某个时刻由垃圾回收器回收