這篇文章主要介紹了關於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; } } }
#
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尽量保持数据
$.extend(true, {}, obj)
var obj2 = JSON.parse(JSON.stringify(obj1))
#熟悉js的人對這兩個方法肯定不陌生,利用原生JSON物件的兩個可以非常方便地實現物件的深複製。
這種方法也有弊端:
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中文網其他相關文章!