再談js傳值和傳址

2022-04-12 02:02:41 字數 1014 閱讀 2340

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 ...