数组是引用类型,当数组作为参数传入函数时,形参复制了实参的值,与实参指向同一个地址,所以形参改变时实参也会改变。
function change(arr) { arr[1] = 3 }
let list = [1,2] change(list) console.log(list) // [1,3] 所以当数组作为函数参数时,一定要明确,我们是否要通过形参来改变实参。
一、想要形参与实参数组指向相同 1、数组拼接 concat() a.concat(b)可以将数组a与数组b拼接到一起,数组a不变,返回新的数组,如果想改变数组a呢?
a=a.concat(b),这样做如果是普通场景可以改变a,但是在函数中,形参数组=形参数组.concat(其他数组)是无法改变实参数组的内容的,因为形参数组与实参数组之间的关系已经断了,形参数组不再指向实参数组,而是指向了一个新的数组。
改用遍历push的方式
function change(arr) { // arr = arr.concat([3,4]) // list=[1,2]
let b = [3,4]
b.forEach(item => {
arr.push(item) // list=[1,2,3,4]
})
}
let list = [1,2] change(list)
改用splice()方法
splice()方法会改变原数组,而不是返回新数组。
function change(arr) { let b = [4, 5] arr.splice(arr.length, 0 , ...b) }
let list = [1,2] change(list) //list=[1,2,4,5] 2、截取子数组slice(start, end) 截取start(包含)到end(不包含)的子数组,不改变原数组,返回新的数组 let array = [1,2,3,4,5,6,7,8] console.log(array.slice(0,4)) // [1,2,3,4] console.log(array) // [1,2,3,4,5,6,7,8] 改用splice()方法
let array = [1,2,3,4,5,6,7,8] array.splice(4) console.log(array) // [1,2,3,4]
3、总之如果想要保持形参与实参的关系就多用splice() (1) 增加元素
arr.splice(要增加元素的位置, 0 , 要增加的元素)
(2) 删除元素
arr.splice(要删除元素的位置, 要删除的个数)
(3) 替换元素
arr.splice(要替换元素的位置,要替换的个数, 替换的新元素) 二·、不想改变实参的内容 (1) 使用 arr.slice(0, arr.length)或者arr.concat()的方式复制数组,或者扩展运算符拷贝,这些方式都是浅拷贝 let array = [1,2,3,4,5,6] function change(arr) { // arr = arr.slice(0, arr.length)
// arr = [...arr] arr = arr.concat() arr[2] = 10 console.log(arr) // [1,2,10,4,5,6] } change(array) console.log(array) // [1,2,3,4,5,6]