再談js傳值和傳址

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

1.值類型是傳值的數組

2.對象和數組是傳址的函數

這兩點經過例子的到了證明spa

然而還有一種狀況沒有討論code

 

對象

 

函數的參數的傳值和傳址blog

經過實驗,在函數中用一個新對象去覆蓋傳入的對象,則相似於傳值的效果,原數據沒法獲得新值io

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 ,相互沒有影響。console

 

那麼問題來了function

 

有時候硬是要經過傳入參數取回返回值要如何作呢?

其實按照定義,是能夠這麼理解的,若是你覆蓋了這個對象,則不是傳址了,若是修改對象的一部分,則仍是傳址,不妨再作一個實驗。

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,則當即取消了全部被選中的文件。

而不用去循環處理過往數據。

以上

相關文章
相關標籤/搜索