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,則當即取消了全部被選中的文件。
而不用去循環處理過往數據。
以上