Js之浅拷贝深拷贝与对象数组的遍历

在js这门语言中,数据存放在堆中,而数据的援用的存放在栈中。

浅拷贝

我们说的浅拷贝,指的是,援用地点的拷贝,栈中两块差别的援用地点都指向了堆中一样一块地区。所以,我们经由过程一个地点修改了堆中的数据,别的一个援用的地点一样会转变。

浅拷贝的罕见写法有直接复制赋值,应用Object.assign()也是浅拷贝。

let obj = {
    'a':1,
    'b':2,
    'c':{
        'c1':3,
        'c2':4
    }
}
obj.b = 22

let newObj = obj
let newObj2 = Object.assign({},obj)

console.log(newObj)    // newObj.b为22
console.log(newObj2)   // newObj.b也为22

深拷贝

和浅拷贝差别的是,深拷贝是零丁拓荒一段堆内存空间,把之前堆内存中的对象复制,如许在栈内存的新的援用会指向新的堆内存空间,新老两块空间相互并没有直接的联络,如许的话,我们修改了之前的对象,新拷贝的对象并不会随之转变。

罕见的深拷贝要领有两种,一种是递归,别的一种是JSON序列化。

function deepCopy(obj){
    let newObj = obj.constructor === Array ? []: {}   //推断是深拷贝对象照样数组
    
    for(let i in obj){
        if(typeof obj[i] === 'object') {
            newObj[i] = deepCopy(obj[i])    //  假如要拷贝的对象的属性依旧是个复合范例,递归
        } else {
            newObj[i] = obj[i]
        }
    }
    
    return newObj
}

let obj = {
    'a':1,
    'b':2,
    'c':{
        'c1':3,
        'c2':4
    }
}
let arr = [1,2,3,[4,5,6],7]

let newObj = deepCopy(obj)
let newArr = deepCopy(arr)

obj.b = 22
arr[3][1] = 55

console.log(obj.b,newObj.b)     // 22 2
console.log(arr[3][1],newArr[3][1])   //55 5

应用递归,当要拷贝的对象或许数组的属性依旧是个对象或许数组时,递归挪用。

除了递归的体式格局,应用JSON序列化可以很轻易的处理深拷贝题目。

// 依旧应用上面的例子
let newObj = JSON.parse(JSON.stringify(obj))

这类要领很奇妙很简朴,然则,局限性在于不能拷贝继续的属性,原型中的属性。只要在一些简朴的场所才引荐应用。

遍历对象

聊完了深拷贝和浅拷贝,接下来讲一下遍历。由于我们发明,上面深拷贝的时刻实行递归的时刻,采纳的是for …in的遍历体式格局。

除了for…in,在js中的遍历体式格局另有许多,比方Object.keys(),for…of等等,那末这些遍历体式格局有什么差别呢。

Object.keys()

这个要领用于遍历,可以遍历出来的东西是对象中一切的可罗列的属性,然则不包含继续过来了。

for…in

for…in平常用于遍历对象,可以返回对象包含继续过来的可罗列属性。

Object.getOwnPropertyNames(obj)

返回对象一切的属性,也包含不可罗列的属性。然则不包含继续过来的。
这个函数会返回一个数组。

这三个遍历对象的要领,都不会返回对象中的symbol属性。

遍历数组

和遍历对象差别,遍历数组也有一些要领。

for…in

for…in除了可以遍历对象,也可以遍历数组,所以上面的例子我们可以用for…in离别遍历对象和数组。

forEach()

这是ES5新供应的一个要领,吸收一个函数作为参数,回调函数。

for…of

ES6供应的遍历器,除了可以遍历数组,还支撑类数组对象,以至是字符串,实在就是继续了Iterator接口的数据构造都可以用for…of来遍历。

for…of轮回可以应用的局限包含数组、Set 和 Map 构造、某些相似数组的对象(比方arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。

我以为,遍历数组,应用for…of结果最好。

    原文作者:张小草1018
    原文地址: https://segmentfault.com/a/1190000013469837
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞