在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 函數(shù)入?yún)⒌膫鬟f

函數(shù)入?yún)⒌膫鬟f

// [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 高級(jí)程序設(shè)計(jì)》中的說法:

基本類型值的傳遞如同基本類型變量的復(fù)制一樣。引用類型值的傳遞則如同應(yīng)用類型變量的一樣

為什么賦值不會(huì)改變外部 arr,而 push 方法則會(huì)改變外部 arr 的值呢?


友情鏈接:
[sof] Is JavaScript a pass-by-reference or pass-by-value language?

回答
編輯回答
乖乖瀦

arr相當(dāng)一個(gè)地址的容器 " arr = [1, 2, 3] "只不過是把新的"[1, 2, 3]"數(shù)組的地址放進(jìn)arr中, 把原來(lái)的地址覆蓋了, 原來(lái)的數(shù)組還是存在原來(lái)的地方

var arr = [1, 2]
生成了2塊空間
內(nèi)存A: 存放數(shù)組的實(shí)例 [1, 2]
內(nèi)存B: 存放"A"的地址 名稱叫 "arr"

arr = [1, 2, 3]
生成了1塊空間
內(nèi)存C: 存放數(shù)組的實(shí)例 [1, 2, 3]
并把 "B"的內(nèi)容從"A"的地址改成"C"的地址

這個(gè)賦值只影響了"B"的值, 并不影響"A"

arr.push(3)
是通過arr 也就是"B"里面的內(nèi)容, 找到"A"并往里面放了個(gè)值, 真正修改到了原來(lái)的數(shù)組

2018年9月7日 06:06
編輯回答
離魂曲

在調(diào)用函數(shù)change的時(shí)候,change這個(gè)函數(shù)的作用域內(nèi)會(huì)有一個(gè)新的變量arr,這個(gè)arr全局的arr都指向同一個(gè)內(nèi)存地址,即存儲(chǔ)數(shù)組[1, 2]的內(nèi)存地址。

代碼段一執(zhí)行arr = [1, 2, 3],也就是在內(nèi)存中存儲(chǔ)一個(gè)新的數(shù)組[1, 2, 3],然后把這個(gè)數(shù)組的內(nèi)存地址賦值給arr,注意這個(gè)arrchange函數(shù)內(nèi)的變量,所以這個(gè)arr指向數(shù)組[1, 2, 3]的內(nèi)存地址,而全局的arr仍然指向[1, 2]的內(nèi)存地址。注意[1, 2, 3]是一個(gè)新的數(shù)組,所以需要一個(gè)新的內(nèi)存空間。

代碼段二執(zhí)行arr.push(3),首先會(huì)找到arr指向的數(shù)組,也就是[1, 2],然后往這個(gè)數(shù)組中添加數(shù)據(jù)3,因?yàn)?code>change函數(shù)內(nèi)的arr全局的arr指向的是同一個(gè)內(nèi)存地址,而這個(gè)地址指向的內(nèi)容已經(jīng)改變了。

2018年9月6日 18:21
編輯回答
默念

有參函數(shù)實(shí)際上有一個(gè)隱式的變量聲明,第一函數(shù),改變的是局部變量的指向地址。第二個(gè)函數(shù)中局部變量指向和全局變量是同一個(gè)地址對(duì)象,所以結(jié)果不一樣。

2017年10月4日 19:55