在平时使用过程中,好像把对象直接传递给函数做参数好像没啥
function changeObj(obj) {
obj.name = 'ff'
}
let obj = new Object()
obj.name = 'dandan'
changeObj(obj)
console.log(obj) // {name: 'dandan'}
从上述代码看出,当对象作为参数传递给函数并且在函数内部发生改变时,对象本身也会改变。复合引用对象的特性。继续看下面的代码
function changeObj(obj) {
obj.name = "fufu";
obj = {age: 999}
}
let obj = new Object();
obj.name = 'dandan'
changeObj(obj)
console.log(obj); //{name: 'fufu'}
上面代码惊奇的打印出了{name: 'fufu'},而我们在函数里明明已经将obj赋值了一个新对象,却好像没有什么效果。
解析:其实之所以有这样的变化,还是对象的引用类型特性造成的。在第一个例子里,将对象传递给函数做参数,实际意义上是传递了一个堆内存地址给他,函数里面外面指向的是同一个内存地址,改变的自然也就是同一个对象。
而在例子二里,obj.name = "fufu";改变的也是同一个对象,但执行到 obj = {age: 999}的时候,obj被赋值了一个新的对象,也就是说,一个新的内存地址被赋予他,切断了与之前地址的联系。但是却并没有删除或改变原本的内存地址。所以外面的obj依旧指向的是原本的地址,而函数内部的obj指向的是刚刚创建的局部变量,并且函数执行完成后就自动销毁。所以外面打印出的依旧是原本的对象。
网友评论