今天在开发的时候,后端返回一个json对象,其中一个list数组是个数组需要我从新构建;
代码简单整理长这样;
let obj = { list: [1,2,34]}
function resolveList(list) {
list=[];
//.......处理list的代码,后续list
// [{},{},{}] list
}
resolves(obj.list)
我想着我传的是个引用类型,后续的obj.list应该已经构建好了;但是后面打印发现obj.list并没有改变;其中坏就坏在 list=[];
这里不置空list直接用拿到的参数list处理,也是ok的。obj.list也是有值的; list=[];
以后值就没改变。我大概想了一下,可能是这样把list定义到全局了,参数的list被覆盖了。然后我在全局打印了list,然而全局也没有list这是我最费解的;
请教下各路彦祖,1,我的list的这个指针为什么会丢失,2,如果是被list=[]覆盖那么为啥全局又没发现这个list
你不能这样写,你要这样写:
或者
对于
resolveList
的参数来说,他就是一个普通局部变量,当你执行resolves(obj.list)
的时候,这个普通变量保存了obj.list
的引用,然后,你再执行list=[]
的时候,这时候这个普通变量就断掉了对obj.list
的引用,改为保存[]
的引用,这时候你拿list
进行操作,这些操作都打不到obj.list
上。因此,如果你想让参数保存对外部对象的引用,就不能对参数进行直接赋值操作。
而
obj.list=[]
的话,因为obj
没有被直接赋值,因此依然保持对外部对象的引用,所以可以很顺利的通过这个引用,把外部对象下的list属性给改了。然后是
list.length=0
的话,还是一样的道理,list
没有被直接赋值,依然保持对外部对象的引用,通过给其属性length
设置为0
的方式,让外部数组的长度变为0,从而丢弃掉数组里面的所有值。因此,你这两个问题的答案: