js里函数参数传递对象传的是指针吗

背景:微信小程序,进入程序一开始会获取用户信息,里面有用户昵称,打印出来是正常的,但是调用了一个函数进行api请求,请求完成后昵称蜜汁变成了base64编码后的了,虽然在调用的这个函数里有base64编码的动作,但是编码的是新var的变量,结果却影响到了外面的变量,我百思不得其解,望解答,万分感谢

app.js获取用户信息:
图片描述

app.js里调用接口
图片描述

这个是调用的那个函数,接受一个object参数
图片描述

取object里的值
图片v的

服务器返回的昵称是base64编码的,这里把它解码
![图片描述

这里两台打印的结果分别在base64解码之前和解码之后,打印的是app.js里一个存放用户昵称的globalData,和data几乎没有半毛钱关系,但是却在这里改变了,
图片描述

阅读 6.6k
6 个回答

js 函数传参都是 按值传递的

具体可以看下 图解JavaScript的参数传递

所有在 取object值的时候,简单深拷贝一下 ,var data = JSON.parse(JSON.stringify(e.data))

js高程 page88

在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript 的概念来说,就是arguments
对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
function setName(obj) {
    obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"

以上代码中创建一个对象,并将其保存在了变量person 中。然后,这个变量被传递到setName()函数中之后就被复制给了obj。在这个函数内部,obj 和person 引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj 也会按引用来访问同一个对象。于是,当在函数内部为obj 添加name
属性后,函数外部的person 也将有所反映;因为person 指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:

function setName(obj) {
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"

这个例子与前一个例子的唯一区别,就是在setName()函数中添加了两行代码:一行代码为obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name 属性。在把person 传递给setName()后,其name 属性被设置为"Nicholas"。然后,又将一个新对象赋给变量obj,同时将其name属性设置为"Greg"。如果person 是按引用传递的,那么person 就会自动被修改为指向其name 属性值为"Greg"的新对象。但是,当接下来再访问person.name 时,显示的值仍然是"Nicholas"。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj 时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

指针的副本

函数参数,传递具体值不会改变,传递对象是传递引用值会改变,就跟赋值一个道理

引用类型应该是指针 所以操作前建议先deep copy.

对象的 任何一个引用 修改了 会导致所有的引用都被修改

还有就是保存到全局这个句注释 真的很吓人啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏