变量的复制
可以分为基本数据类型(Null、Undefined、Number、String、Boolean)和引用类型(Funtion、Object、Array)
基本数据类型是按照值访问,可以直接操作保存在变量中实际的值
引用数据类型是按引用访问的,值是保存在对象上的对象,我们可以对引用类型的值进行添加、改变、删除方法和属性的操作
把A复制给B:首先创建B,再将A的值赋值到新变量被分配的内存中
基本数据类型复制的是值,复制后,两个变量之间独立不影响
引用数据类型复制的是引用地址,复制后,将变量对象中存储的指针复制给新变量分配的内存,两个变量的引用地址相同,指针属于同一个对象,两者之间的变化相互影响
所有函数的参数都是按值传递,把函数外部的值复制给函数内部的参数。
基本数据类型值的传递就是复制值给一个局部变量(命名参数),引用类型值的传递就是复制值在内存中的地址给一个局部变量。因此变量的变化可以反映在函数的外部。
var count = 20;
function addTen(num){
num+=10;
return num;
}
var result = addTen(count)
alert(count);
alert(result);
count是全局变量,
addTen(count)的作用将count的值复制给局部变量num,值加10,体现在返回值num在result上,result=30
对count没有改变,count=20;
var person = new Object();
function setName(obj){
obj.name = 'xia'
}
setName(person);
console.log(person.name);
先声明了一个对象person,
创建设置名字的函数setName,并传入person,将person对象的地址复制给obj,从而person对象上增加了属性name
为了说明传递时对象是按值传递而不是按引用传递,看下列例子
var human = new Object();
function setMessage(obj){
obj.age = 19;
obj = new Object();
obj.name = 'XIA';
obj.age = 18;
}
setMessage(human);
console.log(human.age)
console.log(human.name)
先声明对象human,
创建函数setMessage,可以给对象添加属性,但函数中又重新定义了一次对象,并添加属性,会发生什么呢?
如果参数是引用传递的话,
human先是复制给obj,添加了age属性为19,重新定义对象后,对象内被重置,再添加属性age=18,name=’XIA‘,
最后输出结果应该为:18,XIA
但是真实输出结果为:19,undefined
就是说,参数是按值传递的,可以看上图,obj在重新定义后就指向新的内存空间了并变化属性(局部变量,使用后销毁),human没有相应的变化-原始引用不变,可知这是值传递的复制。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章