我们都知道引用类型作为参数,是值传递,所以当你直接给参数指向另外一个数组的时候,是不会影响到原数组的,和作为参数传入的值。 我们看看例子来理解
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 只是数组更新 数组 新数组 x000000 arr1 arr参数我们用图来理解
堆内存 地址栈 值栈 concat重新指向 数组 concat返回的数组 x000000 x000001 arr1 arr参数看起来和第一种操纵基本一致。
《js高级程序设计》上关于参数传递的描述:所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。 对引用类型内置的方法都是一样,如果我们通过修改参数的指向,是无法影响外部的变量的值,只有会直接修改原数组的方法才会改变外部的变量的值。
直接修改数组,比如push、pop、shift等方法,或者修改属性length等,是会影响到外部的如果是通过修改参数的引用,比如参数需要重新指向一个新生成的数组,比如slice、concat等不是直接修改原数组的方法,是不会影响到外部的参数的。