1. 程式人生 > >再談js傳值和傳址

再談js傳值和傳址

js的傳值和傳址還是真繞,前回文說道

1.值型別是傳值的

2.物件和陣列是傳址的

這兩點通過例子的到了證實

然而還有一種情況沒有討論

 

 

函式的引數的傳值和傳址

通過實驗,在函式中用一個新物件去覆蓋傳入的物件,則類似於傳值的效果,原資料無法得到新值

var s = {value:1}
var s1 = {value:2}

function setValue(arg){
    arg = s1
}

setValue(s)


console.log(s.value)
console.log(s1.value)

這個例子的結果是 s.value = 1 s1.value=2 ,相互沒有影響。

 

那麼問題來了

 

有時候硬是要通過傳入引數取回返回值要如何做呢?

其實按照定義,是可以這麼理解的,如果你覆蓋了這個物件,則不是傳址了,如果修改物件的一部分,則還是傳址,不妨再做一個實驗。

var s = {sn:{value:1}}
var s1 = {value:2}


function setValue(arg){
    arg.sn = s1
}

setValue(s)


console.log(s.sn.value)
console.log(s1.value)

結果都是 2

通過外層再包裝一層物件,成功的 把 s1取了出來,算是一種變通的方法吧

 

一個應用場景,其實是我在做web檔案管理器時遇到的東西。

檔案管理器要選擇檔案,單擊一個檔案,該檔案會顯示選中狀態,按住ctrl繼續單擊其他檔案,又會有一個檔案顯示選中狀態

如果放開ctrl去選擇另外的檔案時要求曾經被選中的取消選中狀態。說的有點兒繞,腦補吧,我也不知道咋描述了。

一個辦法是你可以去用迴圈去取消之前的選中檔案的選中狀態,而另一個方法

將選中檔案的狀態都指向同一個狀態物件,該物件的值是true,當要取消之前的若干選中時,只要把這個物件的值設定為false,則立即取消了所有被選中的檔案。

而不用去迴圈處理過往資料。

以上