Javascript 为什么使用push或任何数组方法会修改原始数组,但将其分配给其他数组并不';T
我不明白为什么将数组赋给新值不会影响新数组。 我知道“推”会修改原始数组,也会修改拼接,而过滤器或切片不会,这不是我的问题。我的问题是为什么分配没有。 我已经浏览了旧问题的答案,说它是通过引用传递的,但是如果它是通过引用传递的,那么更改它的值也会影响引用Javascript 为什么使用push或任何数组方法会修改原始数组,但将其分配给其他数组并不';T,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我不明白为什么将数组赋给新值不会影响新数组。 我知道“推”会修改原始数组,也会修改拼接,而过滤器或切片不会,这不是我的问题。我的问题是为什么分配没有。 我已经浏览了旧问题的答案,说它是通过引用传递的,但是如果它是通过引用传递的,那么更改它的值也会影响引用 const modify = (someArray) => { // modified my array someArray.push(1) // modified my original array so
const modify = (someArray) => {
// modified my array
someArray.push(1)
// modified my original array
someArray[0] = 'A'
// didn't modify my array and I want to know why.
someArray = ['whatever']
}
let myArray = ['a', 'b']
modify(myArray)
console.log(myArray) // ["A", "b", 1]
['a','b']
是一个数组myArray
是一个引用该数组的变量someArray
是modify
函数的局部变量,该函数将采用myArray
的值(即对数组的引用;因此myArray
和someArray
都引用同一数组)。如您所述,someArray.push(1)
和someArray[0]=“A”
都修改了someArray
引用的数组someArray=[“whatever”]
将someArray
的引用更改为新数组[“whatever”]
,但myArray
仍然引用旧数组。在函数的末尾,someArray
变量消失(并且['whatever']
被遗忘,因为不再有任何东西引用它)
让myArray=['a','b']
在内存中创建新数组,并将对它的引用放入myArray
中。现在,myArray
的值是对['a','b']
驻留的内存的引用
将其传递给
modify
函数时,该值(即引用)将从myArray
复制到someArray
。这意味着someArray
可以访问同一数组的同一内存段,因此可以更改该数组中的值,但不能将myArray
(它是对该数组的引用)的值从someArray
更改为,我发现最好将Javascript中的对象看作是作为指针传递和分配的(就像C/C++中指针的工作方式一样)。因此,当您这样做时:
let a = [1,2,3];
let b = a;
现在有两个变量,每个变量都有一个指向相同[1,2,3]
数组的指针。我发现最好考虑数组本身,现在有两个变量,每个变量都指向该数组。当您分配b=a
时,它不会复制数据,它只是将b
指向a
指向的同一数据
如果您使用类似于a.push(4)
或类似于a[0]=9
的赋值来修改该数组,则a
和b
都指向的唯一数组已被修改。因此,无论您是从a
还是从b
访问该数组,都会看到更改,因为这两个变量都指向同一个物理数组对象
但是,如果将其他数组重新分配给b
,如下所示:
b = [9,8,7];
您刚刚获取了一个新数组,并在b
中放置了指向它的指针。另一个变量a
仍然指向用于修改的原始数组。它没有任何改变
当您像在modify()
函数中那样将数组作为参数传递时,函数中的函数参数与上例中的b
变量一样。它只是指向同一数组的另一个变量。如果修改数组本身,则两个变量将指向同一个修改过的数组。但是,如果将参数变量重新指定为指向其他数组,则只有该变量会受到影响。I两个对象(数组)引用内存中的同一对象,这意味着无论何时修改其中一个对象,另一个也会被修改。这并不意味着当我们将其中一个重新分配给一个新值时,第二个值就会改变。所以我们不能重新分配?someArray
和myArray
是两个不同的变量,它们引用内存中的同一个对象。修改someArray
时,也会修改myArray
。但是当您重新分配它时,someArray=['whatever']
。然后它将不引用变量myArray
。变量是值的容器。有些值可以直接修改(对象是可变的),有些值不能直接修改(字符串是不可变的)。分配给变量时,总是将现有值与新值“交换”。请注意,someArray[0]=“A”
不会为变量赋值。它读取变量,“提取”它包含的值并对该值进行变异(更改数组的第一个元素)。“通过指针传递和赋值”听起来与“通过引用传递和赋值”非常相似,这是错误的。另外,对象是引用类型的值这一事实似乎与变量的工作方式无关?@FelixKling-对于任何知道指针在C/C++中如何工作的人来说,描述与Javascript中发生的情况完全匹配。我用这个模型一遍又一遍地解释它,正是因为在我的答案中没有使用“参考”这个词,这常常让人困惑。在C/C++中,如果a
和b
都有指向同一数组的指针,那么通过其中一个对数组内存的任何修改都会修改另一个也指向的内容。但是,如果您为b
分配了不同的内容,它根本不会影响a
所指向的内容。这就是JS的工作原理。是的,我明白了。也许是“by”这个词