ホームページ  >  記事  >  ウェブフロントエンド  >  jsでコピーする方法

jsでコピーする方法

不言
不言オリジナル
2018-07-09 16:50:221999ブラウズ

この記事では主に 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)

4. Traversal

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

2. lodash のマージメソッドを使用して

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 で表現できない属性についてはコピーできません。 ,

オブジェクトが失われる

    プロトタイプチェーンが失われる
  1. コピー効率が低い
  2. 上記の欠点はありますが、この方法でほとんどの状況に十分に対処できます。
  3. 6. 再帰コピー

$.extend(true, {}, obj)

上記のシャローコピートラバーサルオブジェクトメソッドと比較して、このメソッドにはより多くの再帰呼び出しがあるだけです。つまり、オブジェクトのプロパティもオブジェクトであるかどうかを判断し、オブジェクトである場合は、再帰呼び出しは、オブジェクトがオブジェクトでなくなるまでオブジェクトを横断します。

ただし、このメソッドは Function、Regexp、Error などのタイプを考慮しないため、より多くの判断が必要になります。ただし、中心的な考え方は、オブジェクトを再帰的に走査してコピーすることです。また、このメソッドは JSON ディープ コピーよりもわずかに効率的です。 。

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:


ReactのPureComponentの紹介

JS文字列を数値に変換する方法

JS非同期forループの紹介

以上がjsでコピーする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。