一,数据的概念
数据是对客观事物的符号表示,是指所有能输入到计算机中并被计算机程序处理的符号的总称。
二,内存的概念
内存条通电后产生的 可以存储数据的空间(临时的)
内存的产生和死亡:内存条(电路板)=>通电 =>产生内存空间=>存储数据=>处理数据=>断电=>内存空间和数据都丢失
内存一般采用半导体存储单元,包括随机存储器(RAM)(程序运行内存,可存取,断电后消失),只读存储器(ROM)(只读,存永久程序,断电数据不丢失),以及高速缓存(CACHE)(它位于CPU与内存之间,是一个读写速度比内存更快的存储器。)。
内存空间分类:
栈:全局变量/局部变量/标识对象的变量(存地址)
堆:对象(包括函数和数组)
三,变量的概念
可变化的量,由变量名和变量值组成。
每个变量都有对应的一小块内存,变量名用来查找对应的内存,变量值就是这个内存中存储的数据值
四,普通数据类型在和引用数据类型在内存中的存储对比
<script type="text/javascript">
var a=1;
console.log(a); //1
var obj={name:"tom"};
console.log(obj); //{name:"tom"} obj存的是指向堆空间的地址,所以这里读取的是堆空间中的整个对象
console.log(obj.name); //tom
</script>
五,var a=xxx,中存储的数据
1.xxx是基本数据类型
var a=1; //a中存的是值:1
2.xxx是对象
function b(){
alert("lala")
} //b中存的是地址,指向堆空间
3.xxx是变量
var c;
c=a; //赋值基本数据则存值
c=b; //赋值对象则存地址
//故,若是变量,则看它赋值了什么类型,
六,引用变量的赋值问题
var obj={
name:"tom",
age:16
};
var obj2=obj;
obj2.name="Ben";
obj2.age=18;
console.log(obj.name); //Ben
console.log(obj.age); //18
两个指向同一个对象了,他更改了,另一个读取的,自然是更改后的值。
七,函数的执行过程
7-1,变量a作为函数形参和不作为形参时的对比(基本数据类型时)
var a=1;
console.log(a); //1
function add(b){ //这个时候把a的值复制一份,赋值给堆空间中add函数的形参b了
console.log(a); //1
console.log(b); //1
b=b+5; //在栈空间中进行操作,把b加上5
console.log(a); //1 这里访问的依旧是栈空间的a
console.log(b); //6 这里访问的是堆空间中的b
}
add(a); //函数调用结束之后,对应的堆空间数据销毁,b不复存在
console.log(a); //1 a的值始终没有改变
//实际上,函数形参的操作,是把栈空间的值进行复制一份到堆空间进行操作,完成后销毁,不会影响到原有的堆栈空间变量值
var a=1;
function add2(){
a=a+2;
}
add2(a);
console.log(a); //3 因为这个函数不存在形参,它的作用就是直接改变栈空间a的值。所以a变了
7-2,变量a作为函数形参(引用数据类型时)
var a=[1,2,3,4,5];
function change(b){
b[2]="变更索引为2的数组元素";
}
change(a);
console.log(a[2]); //变更索引为2的数组元素
结论:作为形参时,都是把当前变量的值复制一份到堆空间中,只是基本数据类型存的值是值,引用数据类型存的值是地址。而且函数调用结束之后局部变量(包括形参)会被销毁,所以就导致了不同的结果
八,对于释放内存
局部变量:函数执行完毕后立即释放
对象:先成为垃圾对象,再在垃圾回收器回收。