// [1]
var arr = [1, 2]
function change(arr) {
arr = [1, 2, 3]
}
change(arr)
console.log(arr) // => [1, 2]
// [2]
var arr = [1, 2]
function change(arr) {
arr.push(3)
}
change(arr)
console.log(arr) // => [1, 2, 3]
按照《JavaScript 高级程序设计》中的说法:
基本类型值的传递如同基本类型变量的复制一样。引用类型值的传递则如同应用类型变量的一样
为什么赋值不会改变外部 arr
,而 push
方法则会改变外部 arr
的值呢?
友情链接:[sof]
Is JavaScript a pass-by-reference or pass-by-value language?
在调用函数
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
指向的是同一个内存地址,而这个地址指向的内容已经改变了。