js中一个对象当做参数传递时候?

2021-03-20  本文已影响0人  转移到CSDN名字丹丹的小跟班

在平时使用过程中,好像把对象直接传递给函数做参数好像没啥

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指向的是刚刚创建的局部变量,并且函数执行完成后就自动销毁。所以外面打印出的依旧是原本的对象。

上一篇 下一篇

猜你喜欢

热点阅读