js基础 - 变量、内存、数据

1、变量、内存、数据

  • 内存:数据存在内存中,内存中有两种数据(1内部存储的基本数据,2地址值数据(表示该内存,可被多个对象指向)),代码加载到内存中–>编译–>解析执行
  • 内存详解:
    1. 栈内存:效率更高,能申请的空间较小。全局变量、局部变量,用来标识数据的名,在js的5种基础类型中(undefined、null、boolean、string、number),这5种类型(undefined、null、boolean、string、number)是分配的栈内存空间。变量及基础数据类型存在栈内存中。
    2. 堆内存:效率更低,能申请的空间更大。对象(数组、函数(函数本身在堆中,标识函数的函数名在栈中)、对象)即js中的引用类型(array、function、object),给其 引用地址 分配 栈内存 空间,给 引用地址指向的值 则分配的是 堆内存 空间。对象类型(数据类型)的数据存在堆内存中。
  • 示例:
    var object(变量----栈中) = { name:‘name’}(对象----堆中)
    对象变量中存的是 对象内存地址 值(栈内存),通过地址值找到该地址中存储的 地址值数据 (堆内存)
    https://blog.csdn.net/lyyrhf/article/details/115314363
    https://blog.csdn.net/weixin_44949135/article/details/108621932
    https://img2018.cnblogs.com/blog/1153103/201902/1153103-20190228152227115-297624496.png

2、变量赋值

注意:内存内容有两个:基本数据以及地址值数据,变量赋值时存的就是对应的 内存内容

// var a = xxx,a中到底存的是什么
// xxx是基本数据,保存的就是这个数据
// xxx是对象,保存的就是对象的地址值
// xxx是一个变量,保存的就是xxx的内存内容(可能是基本数据、也可能是地址值)
// 2个引用变量指向同一个对象。通过修改一个变量修改对象内部数据,另一个变量看到的就是修改后的数据
// 
var a = 'ceshihsuju1'
var b = a
console.log(b) //ceshihsuju1
var c= {name:12}
var d = c
d.name= 'a'
console.log(c.name,d.name) //a,a
//2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象
var e = {age:12}
var f= e
e={name:'edit',age:13}
console.log(e.age, e.name, f.age, f.name) // 13, edit, 12, undefined
f.age = 14
console.log(e.age, e.name, f.age, f.name) // 13, edit, 14, undefined
function fn2 (obj){
obj = { age:15}
}
fn2(e)
console.log(e.age) //13 
// 最终是13的原因:
// fn2(e)函数执行过程分两步:形参赋值obj = e;函数体执行:obj = { age:15}
// 形参赋值:fn2(e),function fn2 (obj){} ===>此时 e实参变量 与 obj形参变量 指向同一个对像,都指向{name:'edit',age:13}
//函数体执行:function fn2 (obj){obj = { age:15}}函数体执行以后形参obj被重新赋值以后,obj的指向变了,指向{ age:15},但是e并没有改变,它的指向没有变,仍是{name:'edit',age:13},所以e.age仍是13
//且函数执行以后其中的局部变量obj就会释放,而{ age:15}就成了垃圾对象,看不到了
function fn3 (obj){
obj.age = 17
}
fn2(e)
console.log(e.age) //17
// 最终是17的原因:
// fn2(e)函数执行过程分两步:形参赋值obj = e;函数体执行:obj.age = 17
// 形参赋值:fn2(e),function fn2 (obj){} ===>此时 e实参变量 与 obj形参变量 指向同一个对像,都指向{name:'edit',age:13}
//函数体执行:function fn2 (obj){obj.age = 17}函数体执行以后形参obj没有指向另一个对象,指向{name:'edit',age:13},只是修改了指向对象的内部数据,obj.age = 17,e实参变量 与 obj形参变量 指向同一个对像,所以e.age是修改后的17

3、js调用函数传递变量参数

js调用函数时传递变量参数时,到底是值传递还是引用传递

  • 理解1 :都是值(基本值、地址值)传递(无论实参的是基本数据、引用对象还是一个变量名,最终传递的是实参变量的内存内容也就是值)
  • 理解2 :可能是 值传递 也可能是 引用传递(地址值)

4、js引擎管理内存

  • 内存生命周期(内存是通电后产生的临时存储空间)
    分配小内存空间,得到其使用权(注:声明变量、函数以及创建对象时,js引擎会自动为此分配一定大小的内存来存放对应的数据)
    存储数据,可进行反复操作修改数据
    释放小内存空间(当前变量使用的小空间)
  • 释放内存(标识内存可以再分配使用,内存不释放就不能复用)
    局部变量(栈空间的局部变量): 函数执行完立即释放
    对象(堆空间的垃圾对象): 先成为垃圾对象==>垃圾回收器回收
    释放回收 区别:
    1. 回收间隔执行,需要垃圾回收器来回收,且不是立马执行,会有一个间隔时间再进行回收
    2. 释放是立即执行,函数体内的变量为局部变量,函数执行时产生,函数执行完,函数内部的局部变量都会自动释放
function fn (){
var obj = { age:15}
}
fn()
//fn 函数执行完,函数内部的局部变量obj会自动释放,但是obj所指向的对象{ age:15}是在后面的某个时刻由垃圾回收器回收

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

  • 内存是一个容器,用来存储程序运行需要操作的数据
  • 变量是内存的标识,通过变量找道对应的内存,进而操作(读写)内存中的数据
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值