作为参数传入数组之后,使用concat和push不同

mac2024-08-13  60

作为参数传入数组

我们都知道引用类型作为参数,是值传递,所以当你直接给参数指向另外一个数组的时候,是不会影响到原数组的,和作为参数传入的值。 我们看看例子来理解

function test(arr){ console.log(arr) // [1] arr = [2] console.log(arr) // [2] } var arr1 = [1] test(arr1) console.log(arr1)// [1]

我们用图来理解

堆内存 地址栈 值栈 修改引用 数组 数组 x000000 x000001 arr1 arr参数

用图演示过程就可以清晰地了解参数传递的变化过程。

但是如果我们使用的是数组的方法的时候,这些参数传递是否会影响到原本数组。

PUSH方法

function test(arr) { console.log(arr); // [1] arr.push(2); console.log(arr); // [1,2] } var arr1 = [1]; test(arr1); console.log(arr1); // [1,2]

我们用图来理解

堆内存 地址栈 值栈 push 只是数组更新 数组 新数组 x000000 arr1 arr参数

concat方法

function test(arr) { console.log(arr); // [1] arr = Array.prototype.concat(arr, [2]); console.log(arr); // [1,2] } var arr1 = [1]; test(arr1); console.log(arr1); // [1]

我们用图来理解

堆内存 地址栈 值栈 concat重新指向 数组 concat返回的数组 x000000 x000001 arr1 arr参数

看起来和第一种操纵基本一致。

总结

《js高级程序设计》上关于参数传递的描述:所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。 对引用类型内置的方法都是一样,如果我们通过修改参数的指向,是无法影响外部的变量的值,只有会直接修改原数组的方法才会改变外部的变量的值。

直接修改数组,比如push、pop、shift等方法,或者修改属性length等,是会影响到外部的如果是通过修改参数的引用,比如参数需要重新指向一个新生成的数组,比如slice、concat等不是直接修改原数组的方法,是不会影响到外部的参数的。
最新回复(0)