再談js傳值和傳址
阿新 • • 發佈:2018-11-24
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,則立即取消了所有被選中的檔案。
而不用去迴圈處理過往資料。
以上