本文共 1427 字,大约阅读时间需要 4 分钟。
存放在栈内存中的简单数据段,数据大小确定,内存大小空间可以分配。
基本数据类型有Number、String、Boolean、Undefined、Null
var a = 1;var b = a;var b = 2;console.log(a); //1console.log(b); //2
这个例子,相当于b只是a复制粘贴后的一个副本,对b的操作不会影响a的值。下图是该过程的示意图:
存放在堆内存中的对象的值,由地址指针和值组成,地址保存在栈内存中,值保存在堆内存中。堆内存中的内个空间大小不一样。当我们访问引用类型的值时,需要先从栈中获取该对象的指针,然后再从堆内存中获取所需的值。
不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。
引用数据类型有对象、数组、函数
var obj1 = new Object();var obj2 = obj1;obj2.name = 'xpf';console.log(obj1.name); //xpf
这个例子,同样obj2 是 obj1的一个副本,但是不同的是,obj1与obj2的引用地址指向的是同一个堆内存对象。而 obj2.name = 'xpf'; 的意思就是通过引用地址,给这个引用地址所指向的堆内存中的对象Object添加了一个值为xpf的name属性,此时再输出obj1.name,就是获取堆内存中的对象object中的name属性,即xpf。下图是该过程的示意图:
1)基本类型值:存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
2)引用类型值:存储在堆中的对象,也就是说,存储在变量处的值是一个指针,指向存储对象的内存地址。
因为:引用类型值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。
1)在javascript中不允许直接访问保存在堆内存中的对象。
2)而基本类型的值则是可以直接访问到的。
1)基本类型值:将一个变量复制给另一个变量时,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
2)引用类型值:将一个变量复制给另一个变量时,会把这个内存地址赋值给新变量,
也就是说这两个变量都有一个指向堆内存中同一个对象的指针,他们中任何一个作出的改变都会反映在另一个身上。
复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个指针。
首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
1)基本类型值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2)引用类型值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
参考博客:
写在最后:如果还是不理解上面说的,可以这样来
基本数据类型,复制后,两个变量就再无关系,互不影响;
引用数据类型,复制后,对其中一个的操作都会影响到另一个变量。
转载地址:http://gwxgn.baihongyu.com/