この記事では主に js でのコピー方法を紹介します。これを必要な友達に共有します。
js でのコピーにはディープ コピーとシャロー コピーの 2 つの形式があります。日々の作業のレビューを容易にするためによく使用されるメソッドを以下にまとめます
1. json オブジェクトの浅いコピー
2. es6 Object.assign()
var newObj = JSON.parse(JSON.stringify( someObj ) )
3. es6 スプレッド演算子 演算子の構文を展開します
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)
var obj = { 'data': [11, 2, 3], 'name': 'mfg', fn: function() {} }; var objNew = { ...obj };
3.たくさんあります不変ライブラリを使用した深いコピー
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对象上,不包括原型链上的属性。*/
4. jqueryの$.extend() 最初のパラメータがない場合は、浅いコピーになります
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; } } }
5.
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尽量保持数据
js に詳しい人ならこの 2 つはよく知られていますが、この 2 つのネイティブ JSON オブジェクトを使用すると、オブジェクトのディープ コピーを非常に便利に実現できます。
この方法には欠点もあります:
は、文字列、数値、配列などの json で表現できる属性のみをコピーできます。関数、正規表現など、json で表現できない属性についてはコピーできません。 ,
オブジェクトが失われる
6. 再帰コピー
$.extend(true, {}, obj)
上記のシャローコピートラバーサルオブジェクトメソッドと比較して、このメソッドにはより多くの再帰呼び出しがあるだけです。つまり、オブジェクトのプロパティもオブジェクトであるかどうかを判断し、オブジェクトである場合は、再帰呼び出しは、オブジェクトがオブジェクトでなくなるまでオブジェクトを横断します。
ただし、このメソッドは Function、Regexp、Error などのタイプを考慮しないため、より多くの判断が必要になります。ただし、中心的な考え方は、オブジェクトを再帰的に走査してコピーすることです。また、このメソッドは JSON ディープ コピーよりもわずかに効率的です。 。 上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。 関連する推奨事項:以上がjsでコピーする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。