在使用 JS 对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。
var arr = ['a', 'b', 'c'] var arr2 = arr arr2[1] = 'test' console.log('数组的原始值:', arr) // 数组的原始值:[ 'a', 'test', 'c' ] console.log('新数组的值:', arr2) // 新数组的值:[ 'a', 'test', 'c' ]像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗?
JS 的 slice 函数
对于数组类型,可以使用 slice(start, end) 方法,方法返回一个新的 Array 对象,其中包含了原数组的指定部分。
语法:
arr.slice(start, [end])
参数:
arr ——必选项。一个 Array 对象。
start ——必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
end ——可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明:
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。
示例:
var arr = ['a', 'b', 'c'] var arr2 = arr.slice(0) arr2[1] = 'test' console.log('原始值不变:', arr) // 原始值不变:[ 'a', 'b', 'c' ] console.log('新数组的值:', arr2) // 新数组的值:[ 'a', 'test', 'c' ]对象的深浅拷贝
var a = { key1: 'aaaaaa', key2: 234324 } var b = a // 直接赋值,属于浅拷贝 console.log('a', a) // a { key1: 'aaaaaa', key2: 234324 } b.key1 = 'bbbbbb' // 修改key1后,原始a的key1也会被修改 console.log('a', a) // 赋值后的a被修改 { key1: 'bbbbbb', key2: 234324 } console.log('b', b) // b { key1: 'bbbbbb', key2: 234324 }就是把对象的属性遍历一遍,赋给一个新的对象。
var deepCopy = function (source) { var result = {} for (var key in source) { result[key] = typeof source[key] === 'object' ? deepCopy(source[key]) : source[key] } return result } var a = { key1: 'aaaaaa', key2: 234324 } var b = deepCopy(a) // 使用深拷贝 console.log('a', a) // a { key1: 'aaaaaa', key2: 234324 } b.key1 = 'bbbbbb' console.log('a', a) // 赋值后的a不会变 { key1: 'aaaaaa', key2: 234324 } console.log('b', b) // b { key1: 'bbbbbb', key2: 234324 }使用ES6语法的扩展运算符可以更简单
就是...
数组:
var arr = ['a', 'b', 'c'] var arr2 = [ ...arr ] arr2[1] = 'test' console.log('原始值不变:', arr) // 原始值不变:[ 'a', 'b', 'c' ] console.log('新数组的值:', arr2) // 新数组的值:[ 'a', 'test', 'c' ]对象:
var a = { key1: 'aaaaaa', key2: 234324 } var b = { ...a } console.log('a', a) // a { key1: 'aaaaaa', key2: 234324 } b.key1 = 'bbbbbb' console.log('a', a) // 赋值后的a不会变 { key1: 'aaaaaa', key2: 234324 } console.log('b', b) // b { key1: 'bbbbbb', key2: 234324 }