簡單變數和物件好理解:
<?php
// 簡單變數的拷貝
$a = 'human';
$b = $a;
$b = 'cat';
var_dump($a); // string 'human' (length=5)
// 物件的拷貝
class a{}
$a = new a();
$b = $a;
$b->name = 'jack';
var_dump($a); // object(a)[1] public 'name' => string 'jack' (length=4)
物件 $a 和 物件 $b 的記憶體位址指向了同乙個地方,即針對 $a 和 $b 所做的操作都針對同乙個例項。
php 中可以通過 clone 關鍵字按值拷貝物件:使用clone時將按值傳遞
<?php
class
a
$a
=
new
a();
$b
=
clone
$a
;
$b
->name =
'dee'
;
var_dump(
$a
);
// object(a)[1] public 'name' => string 'vardy' (length=5)
var_dump(
$b
);
// object(a)[2] public 'name' => string 'dee' (length=3)
陣列:<?php
// 陣列的拷貝
$a
= [
'human'
,
'orc'
];
$b
=
$a
;
$b
[0] =
'elve'
;
var_dump(
$a
);
// array (size=2)
// 0 => string 'human' (length=5)
// 1 => string 'orc' (length=3)
這樣看,陣列的拷貝是按值傳遞的.
另乙個例子 陣列的迭代器:
<?php
$a
= [
'human'
,
'orc'
,
'elven'
,
'undead'
];
next(
$a
);
$b
=
$a
;
// 此時指標位置也隨著陣列的複製而複製
var_dump(current(
$a
));
// string 'orc' (length=3)
var_dump(current(
$b
));
// string 'orc' (length=3)
當陣列拷貝時,陣列的指標位置也隨著複製。
(next:
current:
<?php
$a
= [
'human'
,
'orc'
,
'elven'
,
'undead'
];
end
(
$a
);
next(
$a
);
// 陣列指標非法,返回 false
$b
=
$a
;
var_dump(current(
$a
));
// string 'human' (length=5)
var_dump(current(
$b
));
// boolean false
當陣列在拷貝前,指標的位置是非法時,拷貝後分別列印兩個陣列指標所指向的當前單元時,出現了不一樣的情況。
原因是陣列變數發生拷貝後,兩個變數中先發生寫操作的,其指標被初始化,即指向第乙個元素,這裡的**中使用的 current 方法也會產生寫操作,因此 $a 的陣列被初始化後指標當前指向的是 'human',而 $b current 方法則返回 false。
以下**同理, $b 首先發生了寫操作:
<?php
$a
= [
'human'
,
'orc'
,
'elven'
,
'undead'
];
end
(
$a
);
next(
$a
);
$b
=
$a
;
$b
=
'dwarf'
;
var_dump(current(
$a
));
// boolean false
var_dump(current(
$b
));
// string 'human' (length=5)
解析:陣列的拷貝是值傳遞。php 在管理記憶體方面有乙個機制叫寫時複製(cow,copy on write),保證了變數間複製值不浪費記憶體:當乙個變數的值複製到另乙個變數時,php 沒有為複製值使用更多的記憶體,相反,它會更新符號表來說明兩個變數擁有相同的記憶體塊,所以當執行下面的**時並沒有建立乙個新的陣列:
<?php
$a
= [
'human'
,
'orc'
,
'elven'
,
'undead'
];
$b
=
$a
;
當修改了 $a 或 $b 任意乙個副本時,php 將分配所需的記憶體來進行複製:
$b
=
'dwarf'
;
此時記憶體將被重新分配。
PHP 陣列的拷貝是按值傳遞 or 按引用傳遞
在記憶中 php 簡單變數的拷貝是按值傳遞,陣列和物件的拷貝是按引用傳遞,即通過引用來實現。簡單變數和物件好理解 簡單變數的拷貝 a human b a b cat var dump a string human length 5 物件的拷貝 class a a new a b a b name j...
JavaScript 按值傳遞 按引用傳遞
1 值的比較 引用的比較 首先,原始值的比較是值的比較 只有在它們值相等的時候它們才相等 比如簡單的 var a1 10 var a2 10 console.log a1 a2 true 其次,物件的比較並非值的比較 物件的比較均是引用的比較,當且僅當它們引用同乙個基物件時,它們才相等。即使兩個物件...
按值傳遞和按引用傳遞
對於基本型別而言,是按值傳遞的 基本型別儲存在棧中 基本型別引數的傳遞和基本型別的複製一樣,傳遞的是值本身 var a 1 function test x test a console.log a 1按值傳遞的意思就是形參是實參的複製,形參實參互不干擾 so,雖然在函式test中a被修改,但是並沒有...