在JavaScript高级程序设计上有这么一句话 所有函数的参数都是按值传递的,那么问题来了,请看下面这个栗子
var obj_1 = {
name :'wxs',
age:14
}
function change(obj){
obj.name = '改变了'
}
change(obj_1)
console.log(obj_1.name)
以上代码的输出结果是改变了。所以会误导部分很多人引用对象类型传递的是引用。为了看的更加清楚,再举一个栗子。
var obj_1 = {
name :'wxs',
age:14
}
function change(obj){
obj.name = '改变了'
obj = {}
obj.name = '新值'
}
change(obj_1)
console.log(obj_1.name)
这里可以很明显的说明问题了。obj.name先设置成‘改变了’,然后设置成空对象,再设置成‘新值’,如果传递的是引用,那么输出obj_1的值应该是‘新值’,但是打印结果依然是‘改变了’。足以证明函数参数传递的是值。
函数执行的整个过程如下,帮助更好的理解。
执行change函数之后,函数内部的obj=obj_1,此时obj和obj_1指向的是同一个内存空间,改变obj的name值,obj_1的name值自然会发生改变这点毋庸置疑,然后执行obj={},将obj指向一个新的对象,这是,obj和obj_1指向的不是同一个内存空间。改变obj的值,obj_1不会再发生变化。