js的傳值和傳址還是真繞,前回文說道
1.值型別是傳值的
2.物件和陣列是傳址的
這兩點通過例子的到了證實
然而還有一種情況沒有討論
即函式的引數的傳值和傳址
通過實驗,在函式中用乙個新物件去覆蓋傳入的物件,則類似於傳值的效果,原資料無法得到新值
var s =var s1 =
function setvalue(arg)
setvalue(s)
console.log(s.value)
console.log(s1.value)
這個例子的結果是 s.value = 1 s1.value=2 ,相互沒有影響。
那麼問題來了
有時候硬是要通過傳入引數取回返回值要如何做呢?
其實按照定義,是可以這麼理解的,如果你覆蓋了這個物件,則不是傳址了,如果修改物件的一部分,則還是傳址,不妨再做乙個實驗。
var s = }var s1 =
function setvalue(arg)
setvalue(s)
console.log(s.sn.value)
console.log(s1.value)
結果都是 2
通過外層再包裝一層物件,成功的 把 s1取了出來,算是一種變通的方法吧
乙個應用場景,其實是我在做web檔案管理器時遇到的東西。
檔案管理器要選擇檔案,單擊乙個檔案,該檔案會顯示選中狀態,按住ctrl繼續單擊其他檔案,又會有乙個檔案顯示選中狀態
如果放開ctrl去選擇另外的檔案時要求曾經被選中的取消選中狀態。說的有點兒繞,腦補吧,我也不知道咋描述了。
乙個辦法是你可以去用迴圈去取消之前的選中檔案的選中狀態,而另乙個方法
即將選中檔案的狀態都指向同乙個狀態物件,該物件的值是true,當要取消之前的若干選中時,只要把這個物件的值設定為false,則立即取消了所有被選中的檔案。
而不用去迴圈處理過往資料。
以上
傳值和傳址
let dadproto let sonproto dadproto sonproto.name 李四 console.log sonproto name 李四 age 20 console.log dadproto name 李四 age 20簡單資料型別 傳值 let a 10 let b a ...
傳值和傳址
在vb中呼叫函式或過程時,傳遞引數有兩種方式 傳址和傳值。其中vb預設為傳址方式,關鍵字byref一般可以省略。byref a as integer 表示引數a以傳址方式傳遞給函式或過程 byval a as integer 表示引數a以傳值方式傳遞給函式或過程 傳址就是把乙個存放資料的記憶體位址傳...
傳值,傳址和傳引用
傳值方式 將實參的值拷貝給函式或方法,在函式內對形參進行操作,操作的物件是實參的拷貝,對實參本身沒有影響,在函式結束返回後,形參被丟棄釋放,實參的內容不會被改變。c 一條基本原則 在預設情況下,引數只能以值傳遞的方式給函式,被傳遞到函式的只是變數的值,永遠不會是變數本身。void exchange ...