UINOTE

JS 深拷贝和浅拷贝

在使用 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 }


上一篇:javascript删除元素节点

下一篇:前端常用正则表达式