首頁 >後端開發 >php教程 >JavaScript中把一個關聯數組a賦值給b,然後改變a的內容,為什麼b也跟著改變?

JavaScript中把一個關聯數組a賦值給b,然後改變a的內容,為什麼b也跟著改變?

WBOY
WBOY原創
2016-08-23 09:17:451973瀏覽

<code>JS:
var a = {"Client":"jQuery","Server":"PHP"};
var b = a;
a["New"] = "Element";
console.log(b);
// 输出 Object { Client="jQuery",  Server="PHP",  New="Element"}

PHP例程1:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = $a;
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP')

PHP例程2:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = &$a; //引用赋值
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP','New'=>'Element')</code>

JavaScript中把一個關聯數組a賦值給b,然後改變a的內容,為什麼b也跟著發生變化?

回覆內容:

<code>JS:
var a = {"Client":"jQuery","Server":"PHP"};
var b = a;
a["New"] = "Element";
console.log(b);
// 输出 Object { Client="jQuery",  Server="PHP",  New="Element"}

PHP例程1:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = $a;
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP')

PHP例程2:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = &$a; //引用赋值
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP','New'=>'Element')</code>

JavaScript中把一個關聯數組a賦值給b,然後改變a的內容,為什麼b也跟著發生變化?

對於陣列這種非普通型別(字串,整數,布林),你的賦值相當於位址拷貝,就是a、b佔用了同一段位址。所以改了b,a也會變,本質上a、b就是一個東西。

這裡這個回答比較詳細,陣列屬於引用型別值,儲存在堆中。 https://www.zhihu.com/questio...

網路上看到有人說,JS中賦值時,原始型別(例如字串)是複製值,引用型別(例如關聯數組)是複製引用.

<code>var a = {"Client":"jQuery","Server":"PHP"};
var b = JSON.stringify(a); //转成字符串后赋值
a["New"] = "Element";
console.log(JSON.parse(b)); //使用时转回关联数组(对象)
//输出 Object { Client="jQuery",  Server="PHP"}

IE8不支持JSON.parse和JSON.stringify,需要引入json2.js:
http://www.json.org/js.html
https://github.com/douglascrockford/JSON-js/blob/master/json2.js
IE9以下版本:
<!--[if lt IE 9]><script src="json2.js"></script><![endif]--></code>

感覺JS數組沒有PHP靈活,PHP支持用&聲明引用賦值,PHP數組是"寫時複製":

<code>echo round(memory_get_usage()/(1024*1024))."MB\n"; //0MB
$a = file('/home/eechen/note.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
echo round(memory_get_usage()/(1024*1024))."MB\n"; //9MB
$b = $a;
echo round(memory_get_usage()/(1024*1024))."MB\n"; //9MB(赋值后内存没有变化)
$b['new'] = 'element';
echo round(memory_get_usage()/(1024*1024))."MB\n"; //14MB(修改后内存发生变化,即写时复制)</code>

因為a跟b指向的都是同一個陣列呀。

要做到不改變,就先把對象轉化成字串,再轉化回來對象,就是兩個不同的對象了。直接用的話,其實就是一個。樓上已經給出正解。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn