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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值