jsは深いコピーメソッドと浅いコピーメソッドを実装します

小云云
リリース: 2018-03-16 16:44:02
オリジナル
2656 人が閲覧しました

深いコピーと浅いコピーについて言えば、値の型参照型を明確にする必要があると思います。この記事では主に、jsで深いコピーと浅いコピーを実装する方法について説明します。みんな。 值类型引用类型,本文主要和大家分享js实现深浅拷贝方法,希望能帮助到大家。

值类型

所谓 值类型 就是 undefinednullnumberstringboolean 等五种基本数据类型, 应该还有一个Symbol类型。

值类型的数据存储在栈内存中

值类型

値の型
いわゆる値の型未定義null、<code>numberstringboolean、およびその他の 5 つの基本データ型には、Symbol 型が必要です。

jsは深いコピーメソッドと浅いコピーメソッドを実装します

値型データはスタック メモリに保存されます


値型 の値を変更することは、次のようにスタック メモリに新しい記憶領域を開くことと同等です。コード内:

var num1 = 5var num2 = num1
ログイン後にコピー

値型の値は変更できません

JavaScriptの元の値(未定義、null、ブール値、数値、文字列)はオブジェクト(配列や関数を含む)に関連付けられています根本的な違い。プリミティブ値は不変です。どのメソッドもプリミティブ値を変更 (または「ミュート」) できません。これは明らかに数値とブール値に当てはまります。数値自体の値を変更することは意味がありませんが、文字列の場合はそれほど明白ではありません。文字列は文字の配列のように見え、インデックスを変更することでインデックスを指定できることが期待されるからです。文字列内の文字。実際、JavaScript ではこれを禁止しています。 string 内のすべてのメソッドは変更された文字列を返すように見えますが、実際には新しい文字列値を返します。

var str = &#39;abc&#39;str[0] = &#39;d&#39;console.log(str)  // &#39;abc&#39;
ログイン後にコピー

値の型の比較は値の比較です

値の型の比較は値の比較です 値が等しい限り、それらは等しいとみなされます

var a = 1;var b = 1;console.log(a === b);//true
ログイン後にコピー

参照型

参照型のデータはヒープメモリに格納されます

参照型の値はヒープメモリに格納され、変数にはスタックメモリに格納されるヒープメモリへのポインタが格納されます。

var person1 = {name:&#39;jozo&#39;};var person2 = {name:&#39;xiaom&#39;};var person3 = {name:&#39;xiaoq&#39;};
ログイン後にコピー
jsは深いコピーメソッドと浅いコピーメソッドを実装します

参照型の値は変更できます

参照型はその値を直接変更できます

 var a = [1,2,3];
 a[1] = 5;
 console.log(a[1]); // 5
ログイン後にコピー
参照型の比較は参照の比較です

したがって、操作を行うたびにjs の参照型 動作時には、そのオブジェクトの参照 (スタック メモリに格納されているポインタ) が操作されるため、2 つの参照型を比較す​​ることは、それらの参照が同じオブジェクトを指しているかどうかを確認することになります。

var a = [1,2,3];var b = [1,2,3];console.log(a === b); // falsevar a = [1, 2, 3]var b = aconsole.log(a === b)  // true
ログイン後にコピー

値渡しとアドレス渡し


基本的なデータ型と参照型の違いを理解したら、値渡しとアドレス渡しの違いも理解できるはずです。

代入操作を実行するとき、基本データ型の代入(=)は、メモリ内に新しいスタックメモリを開き、その新しいスタックに値を代入することです

var a = 10;var b = a;

a ++ ;
console.log(a); // 11console.log(b); // 10
ログイン後にコピー
jsは深いコピーメソッドと浅いコピーメソッドを実装します

つまり、基本型は割り当てられた 2 つの変数は、互いに影響を及ぼさない 2 つの独立した変数です。

ただし、参照型の割り当てはアドレスによって行われます。たとえば、ポインターの指定を変更するだけです。つまり、参照型の割り当ては、スタックに格納されているオブジェクトのアドレスの割り当てになります。この場合、2 つの変数は同じオブジェクトを指すため、操作は次のようになります。両者の間は互いに影響を及ぼします。

var a = {}; // a保存了一个空对象的实例var b = a;  // a和b都指向了这个空对象a.name = &#39;jozo&#39;;
console.log(a.name); // &#39;jozo&#39;console.log(b.name); // &#39;jozo&#39;b.age = 22;
console.log(b.age);// 22console.log(a.age);// 22console.log(a == b);// true
ログイン後にコピー
jsは深いコピーメソッドと浅いコピーメソッドを実装します

浅いコピー

jsは深いコピーメソッドと浅いコピーメソッドを実装します

実装

:

function shallowCopy (src) {
    let  new = {}    for (let i in src) {        if (src.hasOwnProperty(i)) {            new[i] = src[i]
        }
    }    return new}
ログイン後にコピー

深いコピー

優れた操作の 1 つは、JSON.parse と JSON.stringify を使用することです

var a = {
    name: &#39;SpawN&#39;,
    age: 28}var b = JSON.parse(JSON.stringify(a))
b.name = &#39;Johnny.R&#39;console.log(a.name)  // &#39;SpawN&#39;
ログイン後にコピー

もう 1 つは、専門的な操作です。は通常の操作です。この操作は、再帰を使用してターゲット オブジェクトの下のすべての属性を走査することです

function deepCopy(obj) {
    if (typeof obj !== &#39;object&#39;) return
    // 初始化
    var newObj = obj instanceof Array ? [] : {}    for (let k in obj) {        if (obj.hasOweProperty(k)) {
            newObj[k] = typeof obj[k] === &#39;object&#39; ? agruments.callee(obj[k]) : obj[k]
        }
    }    return newObj
}
ログイン後にコピー

これは基本的なディープ コピーにすぎず、一部の境界は適切に処理されません。基本的な考え方は、値がオブジェクトの場合、for in ループを再帰的に実行することです。

関連する推奨事項:

js 配列とオブジェクトの深いコピーと浅いコピーの詳細な説明

配列とオブジェクトの深いコピーと浅いコピーを実装する方法

深いコピーと浅いコピーの入門チュートリアル: 10 個の推奨ゼロ- 深いコピーと浅いコピーに関する入門チュートリアル

🎜

以上がjsは深いコピーメソッドと浅いコピーメソッドを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート