我有两个数组
arr1 = new Array();
arr2 = new Array();
如果我执行以下操作:
arr1 = arr2;
在JavaScript中的是按值或按引用分配的吗?我的意思是,在完成上述操作后,arr2的进一步变化会影响arr1的内容,还会反过来吗?
答案 0 :(得分:3)
为什么不自己创建测试用例,例如
arr1 = new Array();
arr2 = new Array();
arr1.push('bob');
arr2.push('joan');
alert(arr1); // Shows "bob"
alert(arr2); // Shows "joan"
arr1 = arr2;
arr2.push("jacob");
arr1.push("goliath");
alert(arr1); // Shows "joan", "jacob", "goliath"
alert(arr2); // Also shows "joan", "jacob", "goliath"
所以arr1引用arr2(在将arr2赋值给arr1之后)并包含“joan”。然后我们推“jacob”和“goliath”,但最后一个警告显示“joan”,“jacob”和“goliath” - 因为Arrays是对象,arr1和arr2在程序结束时指向同一个Object。
答案 1 :(得分:2)
在javascript数组中是对象。所以,简而言之,是的,你将通过参考。
arr1 = new Array();
arr2 = new Array();
arr1 = arr2;
arr1.push('test');
alert(arr2[0]);//test
如果你想按值传递它,你应该创建一个克隆函数,如:
function cloneValue(value){
if (typeof value != 'object')
return value;
else {
var newObj = {};
for (var prop in value){
newObj[prop] = value[prop];
}
return newObj;
}
}
function cloneArray(array){
var newArray = [];
for(var i = 0; i < array.length; i++){
newArray[i] = cloneValue(array[i]);
}
return newArray;
}
var arr2 = cloneArray(arr1);
这仍然有一个特权,如果数组中的值不是原始值,它们将再次通过引用传递...
我编辑了代码......
答案 2 :(得分:2)
您的案例使用 arr2 持有的对象/数组设置 arr1 。因此,现在 arr1 中的任何更改(如设置索引)都将修改先前在 arr2 中创建的数组。
答案 3 :(得分:0)
这是我写的克隆函数......
/**
* Clone an Object or Array.
*
* @param {Object}
* obj the Object or Array that should be cloned
* @param {Boolean}
* deep if true also clones the elements of an Object or Array,
* default is true
* @return
* @type Object
*/
function cloneObject(obj, deep) {
try {
deep = !deep ? false : true;
if (obj.constructor === Object) {
var nObj = {}, elem = null;
for (elem in obj) {
if (obj.hasOwnProperty(elem)) {
nObj[elem] = deep ? cloneObject(obj[elem]) : obj[elem];
}
}
return nObj;
}
if (obj.constructor === Array) {
var nArr = [], i = 0;
for (i = 0; i < obj.length; i++) {
nArr[i] = deep ? cloneObject(obj[i]) : obj[i];
}
return nArr;
}
} catch (e) {
console.error("cloneObject(", arguments, ") >", e);
}
return obj;
};