JavaScript中传值与传址的概念解析

阅读() @2018-10-29 18:16:10

JavaScript中传值与传址的概念解析:

首先需要知道:JavaScript的数据类型包括:数字(Number)、字符串(String)、布尔值(true和false)、数组(Array)、对象、Null、Undefined。

只要记住一条:对象之间的赋值是传址的,其他数据类型之间的赋值是传值的。

对象传址测试代码如下:

公共部分:

var a = {
		'x' : 1,
		'y' : [2,3],
		'z' : {
			'm' : 4
		}
}
var b = a;

情况一:

a = {};
console.log(b);//Object { x: 1, y: Array[2], z: Object }

a的变化并没有影响b的输出值。

情况二:

a.y = [];
console.log(b);Object { x: 1, y: Array[0], z: Object }

a的y属性是一个数组,情况数组里边的元素,发现b也发生了变化。

再来看基本数据类型传值的测试代码:

var c = 1;
d = c;
c = 2;
console.log(d);//1

把c换成一个【字符串】、【布尔值】等这些基本数据类型,然后还是c赋值给d,当c发生变化的时候,d都不会发生变化,这就是传值。

下面用一张图来解释一下JavaScript数据类型传址与传值的区别:

JavaScript数据类型传值与传址的区别图解

对象实际上是在内存里边开辟了一块儿内存空间,然后把这个内存分配给a,然后b引用了a,实际上是引用了与a同样的一块内存空间,当执行a = {}的时候,相当于在内存中又重新开辟了一块儿内存空间,把它分配给a,但是b还是指向原来的内存空间,所以看到上面的代码情况一中,b的值并没有发生变化。

但如果是改变了a中的某一个属性,并没有给a重新分配内存地址,那么最后b的值也会跟随a发生变化,这就是情况二的原因。

如果是基本类型赋值,那就是简单的传值,c和d之间没有直接的内存地址的联系,所以它们仅仅是一个赋值的关系,其中一个发生变化,也不会影响另外一个!

微信二维码