<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指向的都是同一個陣列呀。
要做到不改變,就先把對象轉化成字串,再轉化回來對象,就是兩個不同的對象了。直接用的話,其實就是一個。樓上已經給出正解。