//[1]vararr=[1,2]functionchange(arr){arr=[1,2,3]}change(arr)console.log(arr)//=>[1,2]//[2]vararr=[1,2]functionchange(arr){arr.push(3)}change(arr)console.log(arr)//=>[1,2,3]按照《JavaScript高级程序设计》中的说法:基本类型值的传递如同基本类型变量的复制一样。引用类型值的传递则如同应用类型变量的一样为什么赋值不会改变外部arr,而push方法则会改变外部arr的值呢?友情链接:[sof]IsJavaScriptapass-by-referenceorpass-by-valuelanguage?
2 回答
侃侃尔雅
TA贡献1801条经验 获得超16个赞
在调用函数change的时候,change这个函数的作用域内会有一个新的变量arr,这个arr和全局的arr都指向同一个内存地址,即存储数组[1,2]的内存地址。代码段一执行arr=[1,2,3],也就是在内存中存储一个新的数组[1,2,3],然后把这个数组的内存地址赋值给arr,注意这个arr是change函数内的变量,所以这个arr指向数组[1,2,3]的内存地址,而全局的arr仍然指向[1,2]的内存地址。注意[1,2,3]是一个新的数组,所以需要一个新的内存空间。代码段二执行arr.push(3),首先会找到arr指向的数组,也就是[1,2],然后往这个数组中添加数据3,因为change函数内的arr和全局的arr指向的是同一个内存地址,而这个地址指向的内容已经改变了。
添加回答
举报
0/150
提交
取消