当前位置:Gxlcms > PHP教程 > JavaScript中把一个关联数组a赋值给b,然后改变a的内容,为什么b也跟着发生变化?

JavaScript中把一个关联数组a赋值给b,然后改变a的内容,为什么b也跟着发生变化?

时间:2021-07-01 10:21:17 帮助过:64人阅读

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')

JavaScript中把一个关联数组a赋值给b,然后改变a的内容,为什么b也跟着发生变化?

回复内容:

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')

JavaScript中把一个关联数组a赋值给b,然后改变a的内容,为什么b也跟着发生变化?

对于数组这种非普通类型(字符串,整型,布尔),你的赋值相当于地址拷贝,就是a、b占用了同一段地址。所以改了b,a也会变,本质上a、b就是一个东西。

这里这个回答比较详细,数组属于引用类型值,存储在堆中。https://www.zhihu.com/questio...

网上看到有人说,JS中赋值时,原始类型(比如字符串)是复制值,引用类型(比如关联数组)是复制引用.

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以下版本:

感觉JS数组没有PHP灵活,PHP支持用&声明引用赋值,PHP数组是"写时复制":

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(修改后内存发生变化,即写时复制)

因为a跟b指向的都是同一个数组呀。

要想做到不改变,就先把对象转化成字符串,再转化回来对象,就是两个不同的对象了。直接用的话,其实就是一个。楼上已经给出正解。

人气教程排行