简单和复杂数据类型存储和传递:
<script type="text/javascript">
var num1 = 0;
var num2 = num1;
num1 = 1;
//请问num2的值会改变吗?
console.log(num2);
var stu1 = new Object();
stu1.name = "张三";
var stu2 = stu1;
//改变stu1的name值
stu1.name = "李四";
//请问stu2的值会改变吗?
console.log(stu2.name);
</script>
结果如下:
又如:
//简单数据类型
var num = 1;
fn1(num);
console.log(num);
function fn1(aaa){
aaa = aaa*10;
}
//复杂数据类型
var obj = new Object();
obj.name = "张三";
fn2(obj);
console.log(obj);
function fn2(object){
object.name = "李四";
}
结果也会一样
为什么会出现这种情况呢?
简单数据类型赋值时,传的是数值。(即开辟新的空间)
而复杂数据类型赋值时,传的时地址(即修改同一片内存空间)
如下图所示:
简单数据类型赋值:
因为是在栈里面另外开辟一个空间,所以num2的值不会改变,改变的是另一个空间的值
复杂数据类型:
而复杂的数据类型时在堆中复用一个内存空间
所以才会出现以上的情况
那么要如何避免呢?
当你向修改成员变量中的简单数据类型时,不要通过参数传递,只要在函数中直接修改就行了。