首頁  >  文章  >  web前端  >  js中複製的方法

js中複製的方法

不言
不言原創
2018-07-09 16:50:222046瀏覽

這篇文章主要介紹了關於js中複製的方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

js中有深拷貝和淺拷貝兩種複製形式,以下總結常用方法,方便平時工作複習使用

一、淺拷貝

1、json物件淺拷貝

var newObj = JSON.parse(JSON.stringify( someObj ) )

#2、es6 Object.assign()

const objA = { name: 'cc', age: 18 }
    const objB = { address: 'beijing' }
    const objC = {} // 这个为目标对象
    const obj = Object.assign(objC, objA, objB)    // 我们将 objA objB objC obj 分别输出看看
    console.log(objA)   // { name: 'cc', age: 18 }
    console.log(objB) // { address: 'beijing' }
    console.log(objC) // { name: 'cc', age: 18, address: 'beijing' }
    console.log(obj) // { name: 'cc', age: 18, address: 'beijing' }

    // 是的,目标对象ObjC的值被改变了。
    // so,如果objC也是你的一个源对象的话。请在objC前面填在一个目标对象{}
    Object.assign({}, objC, objA, objB)

 3、es6  Spread Operator 展開運算子語法

#
  var obj = {                'data': [11, 2, 3],                'name': 'mfg',
                fn: function() {}
            };  var objNew = { ...obj
            };

4、遍歷

function sallowCopy(source) {    // source 不是对象,而是【原始类型】的情况
    // 原始类型说明详见http://www.jianshu.com/p/b161aeecb6d6
    if (null == source || "object" != typeof source) return source;    
    // 其他情况都将 source 当作简单对象来处理
    var target = {};    for (var key in source) {        if (source.hasOwnProperty(key)) {  // 仅拷贝自身的属性
            target[key] = source[key];
        }
    }    return target;
}/*这个浅拷贝会将source对象上的所有[可枚举属性]都拷贝到target对象上,不包括原型链上的属性。*/

二、深拷貝

1、借助lodash的merge方法

    #
    import merge from "lodash/object/merge";function commentsById(state = {}, action) {    switch(action.type) {        default : {           if(action.entities && action.entities.comments) {               return merge({}, state, action.entities.comments.byId);
               }           return state;
            }
        }
    }
  1. 3、存在大量深拷貝借助immutable庫
  2. #

    const { Map } = require('immutable')
    const map1 = Map({ a: 1, b: 2, c: 3 })
    const map2 = map1.set('b', 50)
    map1.get('b') // 2map2.get('b') // 50尽量保持数据

  3. 4、jquery的$.extend()  如果沒有第一個參數則為淺拷貝

  4. $.extend(true, {}, obj)

#5、JSON物件的方法

##
var obj2 = JSON.parse(JSON.stringify(obj1))

#熟悉js的人對這兩個方法肯定不陌生,利用原生JSON物件的兩個可以非常方便地實現物件的深複製。

這種方法也有弊端:

只能複製能用json表示的屬性,例如String、Number、Array等,對於不能用json表示的屬性例如Function、Regexp等則會遺失

物件的原型鏈遺失

複製效率較低

雖說有以上缺點,但這種方式也足以應付大部分情況了。

6、遞歸複製

function cloneDeep(obj) {  if (obj == null || typeof obj !== 'object') return obj  var newObj = Array.isArray(obj) ? [] : {}  for (let i in obj) {    if (obj.hasOwnProperty(i)) {      var value = obj[i]
      newObj[i] = typeof value === 'object' ? clone(value) : value
    }
  }  return newObj
}
#########這種方式與上面淺複製的遍歷物件方式相比只是多了遞歸調用,即判斷對象的屬性是否也為對象,是則遞歸呼叫遍歷這個對象,直到不為對象為止。 ###但是這種方式也沒有考慮Function、Regexp、Error等類型,需要更多的判斷,但是核心思想也還是遞歸遍歷對象複製,另外這種方式比JSON的深複製效率稍高。 ######以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網! ######相關推薦:#########React之PureComponent的介紹###############JS字串轉數字的方法##### ##########js 非同步for迴圈的介紹#########

以上是js中複製的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn