PHP代碼:
<code><?php $key = [1,2]; function add($key){ array_push($key,'dddss'); print_r($key); } add($key); print_r($key);</code>
輸出
<code>Array ( [0] => 1 [1] => 2 [2] => dddss ) Array ( [0] => 1 [1] => 2 ) </code>
JS代碼:
<code>var $key = [1,2]; function addkey($key){ let hello = $key; hello.push(9) console.log(hello) console.log($key) } addkey($key) console.log($key)</code>
輸出:
<code>[ 1, 2, 9 ] [ 1, 2, 9 ] [ 1, 2, 9 ] </code>
我想要的是函數內的處理不影響函數外,也就是類似PHP的結果,也想知道什麼原因
PHP代碼:
<code><?php $key = [1,2]; function add($key){ array_push($key,'dddss'); print_r($key); } add($key); print_r($key);</code>
輸出
<code>Array ( [0] => 1 [1] => 2 [2] => dddss ) Array ( [0] => 1 [1] => 2 ) </code>
JS代碼:
<code>var $key = [1,2]; function addkey($key){ let hello = $key; hello.push(9) console.log(hello) console.log($key) } addkey($key) console.log($key)</code>
輸出:
<code>[ 1, 2, 9 ] [ 1, 2, 9 ] [ 1, 2, 9 ] </code>
我想要的是函數內的處理不影響函數外,也就是類似PHP的結果,也想知道什麼原因
let hello = $key.slice();
你的函數參數是一個數組,而數組在js中是按照引用來傳遞的。 。你在函數內部使用let 將一個陣列的引用賦值給另一個變數的時候。實際上,hello和$key都同時指向了一個值,這裡就是length為2的陣列。所以你對任何一個變數做push或其他操作的時候,改變的其實是兩個變數同時指向的那個值。
PHP 預設傳入參數是傳的拷貝,不是引用,但 JS 傳的一直都是引用,所以,只需要在裡面拷貝一個來改就行了
<code class="javascript">var $keys = [1, 2]; function addkey($keys) { // 拷贝一份 let hello = [].concat($keys); hello.push(9); console.log(hello); console.log($keys); } addkey($keys); console.log($keys);</code>
問題在於引用傳值。其實這他會出現在PHP。
<code>$obj = new stdClass(); $obj->name = 'aa'; function change($o) { $o->name = 'bb'; } change($obj); echo $obj; // 'bb'</code>
不同的地方是js的陣列也是對象,也是引用傳值。 你可以搜尋一下‘克隆對象’。這個問題的答案,上面的回答已經給出。
php 用傳入參數的時候加上& 就是引用傳值了,那就跟你js程式碼跑出來一樣了