数据、内存、变量

本文介绍了数据、内存和变量的基本概念。数据是存储在内存中的信息,具有可读写、可传递和可运算的特性。内存分为栈内存和堆内存,用于临时存储数据,断电后数据消失。变量作为内存的标识,其变量名指向内存中的数据。讨论了赋值操作、引用变量及数据传递的情况,并简要概述了JavaScript引擎的内存管理,包括内存生命周期和释放机制。

  1. 1.什么是数据?
    存储在内存中的代表特定信息,本质上0101
    数据的特点:可读写,可传递,可运算
    一切皆数据
    内存中所有操作的目标:数据
    算术运算 逻辑运算 赋值 运行函数
    2.什么是内存?
    内存条通电以后产生的可存储数据的空间(临时的)
    内存的产生和死亡:内存条(电路板)–通电–产生内存空间–存储数据–处理数据–断电–内存空间和数据都消失
    一块小内存的2个数据:
    内部存储的数据
    地址值
    内存的分类:
    栈内存:全局变量/局部变量
    堆内存:对象
    3.什么是变量?
    可变化的量,由变量名和变量值组成
    每个变量都对应一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
    4.内存,数据,变量的关系?
    内存(RAM)是用来存储数据的空间(临时) (硬盘(ROM)是永久的空间,很大,但是操作很慢)
    变量是内存的标识
    变量名用来查找对应的内存,变量值就是内存中保存的数据
  2. 问题:

1.关于赋值与内存的问题
var a= xxx,a 内存中到底保存的是什么?
如果xxx是基本数据,内存中保存的就是这个数据
如果是对象,内存中保存的是对象的地址值
如果xxx是一个变量,内存中保存的是xxx的内存内容(基本数据值或者对象地址值)
2.关于引用变量赋值的问题
多个引用变量指向同一个变量,通过一个变量修改对象的数据,其他变量也会变
两个引用变量指向同一对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象
3.关于数据传递的问题
在js中调用函数时传递变量参数时,是值传递还是引用传递?
理解1:都是值传递,都是传的变量的内容,只是这个值有两种情况,一种是地址值一种是基本值。
理解2:可能是值传递也可能是引用传递(传的是地址值)
4.js引擎怎么管理内存
1.内存生命周期
分配小内存空间,得到使用权
存储数据,可以反复进行操作
释放当前小内存空间
2.释放内容
局部变量:函数执行完后释放
对象: 成为垃圾对象之后垃圾回收回收

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		  
		  
		  
	</head>
	<body>
		<script type="text/javascript">
			/*
	    js变量都保存在栈内存
			 基本类型的值都直接在栈内存中存储,值与值独立存在修改一个变量不影响其他
		对象保存在堆内存中,每创建一个对象就会在堆内存中开辟一个空间,而变量保存的是对象的内存地址(引用),如果两个变量
	都保存的是同一个引用,当通过一个变量改变对象属性时,另一个也会变
			*/
			var obj={  //obj在栈内存,读了obj的地址值(只有一种情况读的是地址值,其他时候用的是内存中存的数据)
				name:'liu',
				age:20
			}
			console.log(obj)  //{name:"liu",age:20}
			var a=obj;  //不是将obj的地址值读取,而是将obj的内存内容(地址值数据)拷贝给a. 
			var b=a; //将a的内存内容拷贝给b,也就是obj的内存内容(地址值数据)
			console.log(a,b); //{name:"liu",age:20}  {name:"liu",age:20}
			a.name="yu";
			
			//		      多个引用变量指向同一个变量,通过一个变量修改对象的数据,其他变量也会变
			console.log(a,b);//{name:"yu",age:20} {name:"yu",age:20}
			console.log(obj);//{name:"yu",age:20}
			
			
			
			//			  两个引用变量指向同一变量,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象
			var obj2={
				name:"bob",
				age:21
			}
			b=obj2;
			console.log(b)  //{name:"bob",age:21}
			console.log(a) //{name:"yu",age:20}
			
			
			
			//
			//
			//需要特别理解的一点
			//对象传址  
		    //两个引用变量指向同一对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象
			function fn(obj3){
				obj3={age:15,name:'tom'}  
			}
			fn(a)    //obj3是自动释放,obj3指向的对象是在后面某个时刻被垃圾回收回收.
			/*  a传过去地址值, 那么,obj3就和a指向同一个对象obj,  然后将一个对象赋值给obj3, 那么obj3的地址值不再和a一样,变成另一个个对象的地址值
			    而a未受影响!!!!!!!!!!!!!!!!
				函数执行完后,obj3自动释放,这个对象成为垃圾对象,这个对象中的值没有覆盖a原本的值.!!!!!!!!!!!!!!!!!!!!!!!
				
			*/
			console.log(a)  //{name:"yu",age:20}

            
			//变量传值
	        var x=3;
			function fn( x){
				x = x+1
			}
			fn(x);
			console.log(x);//3
		</script>
	</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值