在javascript中,数组显示为';传递值';行为而不是';通过引用传递';

在javascript中,数组显示为';传递值';行为而不是';通过引用传递';,javascript,arrays,pass-by-reference,pass-by-value,primitive-types,Javascript,Arrays,Pass By Reference,Pass By Value,Primitive Types,我知道数组在javascript中是一个对象,这使它成为非原始数据类型,默认情况下,这使它成为一个pass-by引用。 现在在我遇到的大多数用例中都是这样,但是我共享的代码显示了一种我不理解的奇怪行为,它看起来更像是一种“传递值类型” var arr = ['a','b','c'] /* function addArr(ar){ ar.push('d') return ar } console.log(addArr(arr)) // ['a', 'b', 'c', 'd']

我知道数组在javascript中是一个对象,这使它成为非原始数据类型,默认情况下,这使它成为一个pass-by引用。 现在在我遇到的大多数用例中都是这样,但是我共享的代码显示了一种我不理解的奇怪行为,它看起来更像是一种“传递值类型”

var arr = ['a','b','c']
/*
function addArr(ar){
    ar.push('d')
    return ar
}

console.log(addArr(arr))  // ['a', 'b', 'c', 'd']
console.log(arr)          // ['a', 'b', 'c', 'd']
*/

//the above output is expected behavior for an Array object



function changeArr(ar){

    console.log(ar)   //1-// ['a', 'b', 'c']
    ar = ['12','11']
    console.log(ar)   //2-// ['12', '11']
    return ar
}

console.log(changeArr(arr)) //3-// ['12', '11']
console.log(arr)            //4-// ['a', 'b', 'c']

//now I expect the forth console output to be  ['12','11'] here because it is an object
这也许会让一切变得最清楚:

var arr = [1,2,3,4];
console.log(changeArr());
console.log(arr);

您基本上是在重新分配对象,而不是修改原始对象

ar = ['12','11']

这就是Javascript重新分配新值的原因。

请查看注释

让arr=[1,2,3,4];
功能更改ar(ar){
//控制台日志(ar)
ar=['12','11']//创建一个新数组,即在堆中创建一个新空间,将这些值放在那里,并将其引用存储在ar中,或将其分配给引用
//控制台日志(ar)
返回ar
}
功能更改ARR2(ar){
ar.push(55);//这里我们更改了存储在ar中的引用所指向的数组
返回ar
}
控制台日志(changeArr(arr))
console.log(changeArr2(arr));

console.log(arr)//现在原始数组也包含55个
可能的重复项,因为您为引用分配了一个新数组,使其成为一个新对象。JavaScript总是按值传递。但是,对象的值是其引用。但是,如果重新分配变量,则不会更改引用末尾的对象。好的,这确实说明了这一点,因此我在函数中创建了一个与函数参数无关的新数组,因此这两个对象是不同的,但是我从未在函数中声明ar。我的意思是,在changeArr函数中应该有一些类似于'var ar=[“12”,“11”]”的声明,以表明这不是同一个数组。尽管代码的行为方式是相同的,即使我使用'var ar=[“12”,“11”]或'ar=[“12”,“11”],您也不需要指定
var
关键字来声明某些内容。打开控制台并键入
ar=['12','11']
。其次该死的电脑,它们总是完全按照你的吩咐去做,而从不按照你的要求去做:)
var arr = [1,2,3,4];
console.log(changeArr());
console.log(arr);
ar = ['12','11']