検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptディープコピー(deepClone)の詳細説明

JavaScript ディープ コピーは、初心者だけでなく経験豊富な開発者でもよく遭遇する問題であり、JavaScript ディープ コピーをよく理解できません。

ディープコピー(deepClone)?

深いコピーの反対は浅いコピーです。多くの初心者はこの概念に触れると非常に混乱します。

ディープコピーを使用する理由は何ですか?

多くの場合、変数に値を代入し、メモリアドレスに値を代入する必要がありますが、参照値型を代入する場合、メモリ領域を共有するだけなので、代入は以前のものと一貫性が保たれます。価値。 。

具体的な例を見てみましょう

// 给test赋值了一个对象
var test = {
  a: 'a',
  b: 'b'
};
 
// 将test赋值给test2
// 此时test和test2是共享了同一块内存对象,这也就是浅拷贝
var test2 = test;
 
test2.a = 'a2';
 
test.a === 'a2'// 为true

イラスト:


これで、参照値型データが相互に影響を与える理由を簡単に理解できます。

実装

ディープコピー関数を実装するには、JavaScriptの数値型について話し合う必要があります。

JavaScriptの型を決定する

JavaScriptには次の基本的な型があります

型の説明
unknown未定義の型には、値が1つだけあります。未定義は、変数に値が割り当てられていない場合の値です
null null型も空のオブジェクト参照である null 値が 1 つだけあります
Boolean Boolean には true と false の 2 つの値があります
String テキスト情報を表します
Number 数値情報を表します
Object 関数や関数を含む一連の属性の順序付けされていないコレクションですarray 配列
typeof では判定できません 関数や配列については、ここでは Object.prototype.toString メソッドを使用します。
[デフォルトでは、各オブジェクトは Object から toString() メソッドを継承します。このメソッドがオブジェクト自体またはより上位のプロトタイプの同じ名前のメソッドによってオーバーライド (シャドウ) されていない場合、オブジェクトの toString() が呼び出されます。 ) メソッドは "[オブジェクト タイプ]" を返します。ここでの文字列タイプはオブジェクト タイプを表します][1]

function type(obj) {
  var toString = Object.prototype.toString;
  var map = {
    '[object Boolean]' : 'boolean', 
    '[object Number]'  : 'number', 
    '[object String]'  : 'string', 
    '[object Function]' : 'function', 
    '[object Array]'  : 'array', 
    '[object Date]'   : 'date', 
    '[object RegExp]'  : 'regExp', 
    '[object Undefined]': 'undefined',
    '[object Null]'   : 'null', 
    '[object Object]'  : 'object'
  };
  return map[toString.call(obj)];
}

deepClone の実装

非参照値タイプの値、直接代入、および参照値タイプの場合(オブジェクト) を再度走査し、再帰的に割り当てる必要があります。

function deepClone(data) {
  var t = type(data), o, i, ni;
   
  if(t === 'array') {
    o = [];
  }else if( t === 'object') {
    o = {};
  }else {
    return data;
  }
   
  if(t === 'array') {
    for (i = 0, ni = data.length; i < ni; i++) {
      o.push(deepClone(data[i]));
    }
    return o;
  }else if( t === &#39;object&#39;) {
    for( i in data) {
      o[i] = deepClone(data[i]);
    }
    return o;
  }
}

ここで注意すべき点があります。関数の種類について、ここのブロガーは値を直接割り当てるか、メモリ値を共有します。これは、関数が入力値と戻り値を持つ特定の関数を完了することに重点があり、上位レベルのビジネスにとってはビジネス関数を完了することに重点があり、関数を実際にディープ コピーする必要がないためです。

しかし、関数の型をコピーするにはどうすればよいでしょうか?

実際、ブロガーは new を使用して操作することしか考えていませんでしたが、関数は 1 回実行されます。実行結果がどうなるかは想像できません。 o(╯□╰)o!他に良いアイデアはまだないので、皆さんのご指導大歓迎です!

この時点で、ディープコピーはほぼ実装されていますが、シャローコピーはまだ実装されていないと思う人はいますか?

浅いコピーですか?

シャローコピーの場合は、共通メモリ領域を操作するだけと理解できます!ここには危険が潜んでいるでしょう! (.﹏.*)

この共有データを制御せずに直接操作すると、頻繁にデータ異常が発生し、他の部分によってデータが変更されてしまいます。したがって、データ ソースを直接操作するのではなく、データ ソースでデータに対して CURD 操作を実行するためのいくつかのメソッドをカプセル化する必要があります。

おそらくここでほぼ完成ですが、フロントエンドとしては JavaScript 自体だけでなく、DOM やブラウザなども考慮する必要があります。

要素の型

次のコードを見てください。何が返されるでしょうか?

Object.prototype.toString.call(document.getElementsByTagName('div')[0])

答えは、[object HTMLDivElement]です

時々、dom 要素を保存して、誤って深いコピーを作成してしまうことがあります。 Element 要素に対する判断力が欠けています。 Element要素を判定するにはinstanceofを使用して判定します。異なるタグの場合、tostring は異なるタグに対応するコンストラクターを返すためです。

function type(obj) {
  var toString = Object.prototype.toString;
  var map = {
    &#39;[object Boolean]&#39; : &#39;boolean&#39;, 
    &#39;[object Number]&#39;  : &#39;number&#39;, 
    &#39;[object String]&#39;  : &#39;string&#39;, 
    &#39;[object Function]&#39; : &#39;function&#39;, 
    &#39;[object Array]&#39;  : &#39;array&#39;, 
    &#39;[object Date]&#39;   : &#39;date&#39;, 
    &#39;[object RegExp]&#39;  : &#39;regExp&#39;, 
    &#39;[object Undefined]&#39;: &#39;undefined&#39;,
    &#39;[object Null]&#39;   : &#39;null&#39;, 
    &#39;[object Object]&#39;  : &#39;object&#39;
  };
  if(obj instanceof Element) {
    return &#39;element&#39;;
  }
  return map[toString.call(obj)];
}

最初に JSON.stringify を渡し、次に JSON.parse を渡してディープ コピーを実現します。ただし、データ型は基本的な数値型のみをサポートします。

var obj = {
  a: &#39;a&#39;, 
  b: function(){console.log(&#39;b&#39;)}
}
 
//在JSON.stringify的时候就会把function给过滤了。
 
JSON.stringify(obj)// "{"a":"a"}"

概要

ディープコピーの概要とディープコピーの実装方法について説明します。さまざまなシナリオで、ビジネス シナリオに基づいてディープ コピーを使用する必要があるかどうかを判断する必要があります。

JavaScript ディープコピー (deepClone) 関連記事の詳細については、PHP 中国語 Web サイトに注目してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境