JavaScript の浅いコピーの実装

May 26, 2023 pm 06:06 PM

JavaScript 開発では、オブジェクトまたは配列のコピー操作を処理する必要があることがよくあります。実際の開発では、浅いコピー、つまり、あるオブジェクトまたは配列の内容を別のオブジェクトまたは配列にコピーする必要があることがよくありますが、コピーされた新しいオブジェクトまたは配列は、元のオブジェクトまたは配列とデータの一部を共有します。この記事ではJavaScriptでシャローコピーを実装する方法を紹介します。

1.浅いコピーとは何ですか?

JavaScript では、オブジェクトと配列は両方とも参照型です。オブジェクトまたは配列を新しい変数に代入するとき、実際には元のオブジェクトまたは配列の参照を新しい変数に代入します。

たとえば、次のコードはオブジェクトを新しい変数に割り当てます:

let obj1 = { name: '张三', age: 18 };
let obj2 = obj1;
ログイン後にコピー

この例では、obj2obj1 は異なる 2 つではありません。オブジェクトですが、同じメモリ アドレスを指している 2 つの参照があります。

実際の開発では、オブジェクトまたは配列の内容を別のオブジェクトまたは配列にコピーする必要がある場合があります。その場合は浅いコピーが必要です。

浅いコピーとは、オブジェクトまたは配列の第 1 レベルのデータ構造のみをコピーすることを指します。オブジェクトまたは配列にオブジェクトまたは配列も含まれている場合、コピーされた新しいオブジェクトまたは配列は、これらの参照型を元のオブジェクトと共有します。

JavaScript の浅いコピーの実装

図に示すように、オブジェクト A には 2 つの属性 a と b が含まれており、属性 b の値は次のとおりです。オブジェクト B。オブジェクト B また、2 つの属性 c と d も含まれます。オブジェクト A の浅いコピーが作成されると、新しいオブジェクト C が生成されます。オブジェクト C は、オブジェクト A と属性 a および b を共有します。つまり、浅いコピーはオブジェクト A の第 1 レベルの構造のみをコピーし、オブジェクト B はオブジェクト A の第 1 レベルの構造のみをコピーします。オブジェクト C とオブジェクト A はオブジェクト B を共有します。つまり、2 つのオブジェクトのアドレスは同じです。

2. 浅いコピーの実装方法

次に、JavaScript での一般的な浅いコピーの実装方法をいくつか紹介します。

  1. 手動トラバーサル

オブジェクトまたは配列を手動でトラバースし、各属性または要素を新しいオブジェクトまたは配列にコピーします。この方法はシンプルで理解しやすく、コードの可読性も高くなりますが、入れ子の階層が多いオブジェクトや配列の場合、コード量が非常に多くなります。

function shallowCopy(obj) {
  if (Array.isArray(obj)) {
    return obj.slice();
  } else if (typeof obj === 'object' && obj !== null) {
    let newObj = {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        newObj[key] = obj[key];
      }
    }
    return newObj;
  } else {
    return obj;
  }
}
ログイン後にコピー

この例では、まず、コピーされるオブジェクトが配列であるかオブジェクトであるかを判断します。配列の場合は、slice() メソッドを使用して浅いコピーを作成します。オブジェクトの場合は、オブジェクトのプロパティをループして各プロパティを新しいオブジェクトにコピーし、最後に新しいオブジェクトを返します。

  1. Object.assign()

Object.assign() メソッドは、1 つ以上のオブジェクトのプロパティをターゲット オブジェクトにコピーするために使用されます。 、複数のオブジェクトが同じプロパティを持つ場合、後続のオブジェクトのプロパティは前のオブジェクトのプロパティを上書きします。 Object.assign() このメソッドは、オブジェクトの第 1 レベルのデータ構造のみをコピーします。オブジェクトに参照型属性が含まれる場合、新しいオブジェクトと元のオブジェクトはこれらの参照型属性を共有します。

let obj1 = { name: '张三', age: 18, hobbies: ['coding', 'reading'] };
let obj2 = Object.assign({}, obj1);
ログイン後にコピー

この例では、Object.assign() メソッドを使用して、オブジェクト obj1 を新しい空のオブジェクトにコピーし、新しいオブジェクト obj2 を生成します。

Object.assign() メソッドを使用する場合、最初のパラメータはターゲット オブジェクトである必要があり、次のパラメータはソース オブジェクトであることに注意してください。ソース オブジェクトが同じプロパティを持つ場合は、の場合、後続のオブジェクトのプロパティは前のオブジェクトのプロパティを上書きします。ソース オブジェクトに参照型のプロパティがある場合、コピーされた新しいオブジェクトはこれらのプロパティを元のオブジェクトと共有します。

  1. スプレッド演算子

スプレッド演算子 (スプレッド演算子) は ES6 の新しい構文で、配列またはオブジェクトを展開し、その内容を別のオブジェクトにコピーするために使用できます。配列またはオブジェクト。スプレッド演算子は、オブジェクトまたは配列の第 1 レベルのデータ構造でのみ使用できます。オブジェクトまたは配列に参照型のプロパティが含まれる場合、新しいオブジェクトまたは配列は、これらのプロパティを元のオブジェクトまたは配列と共有します。

let arr1 = [1, 2, 3];
let arr2 = [...arr1];

let obj1 = { name: '张三', age: 18, hobbies: ['coding', 'reading'] };
let obj2 = { ...obj1 };
ログイン後にコピー

この例では、スプレッド演算子を使用して、配列 arr1 とオブジェクト obj1 の内容を新しい配列とオブジェクトにコピーし、新しい配列 arr2 とオブジェクト obj2 を生成します。

スプレッド演算子は使いやすく簡潔であり、コードは非常に読みやすいですが、多くのネストされたレベルを持つオブジェクトまたは配列の場合、コードの量は依然として比較的多くなります。

  1. Array.from()

Array.from() メソッドは、配列のようなオブジェクトまたは反復可能なオブジェクトを新しいオブジェクトに変換するために使用されます。配列は、配列の浅いコピーに使用できます。

let arr1 = [1, 2, 3];
let arr2 = Array.from(arr1);
ログイン後にコピー

この例では、Array.from() メソッドを使用して配列 arr1 を新しい配列 arr2 に変換し、浅いコピーを実装します。

Array.from() メソッドは、配列のようなオブジェクトまたは反復可能なオブジェクトの浅いコピーにのみ使用できることに注意してください。オブジェクトの場合は、他のメソッドを使用する必要があります。

3. 概要

この記事では、手動トラバーサル、Object.assign() メソッド、スプレッド演算子、Array.from() メソッドなど、JavaScript での浅いコピーの実装について紹介します。実際の開発では、実際のニーズに応じて、シャロー コピー操作を実行するための最適な方法を選択できます。浅いコピーは、オブジェクトまたは配列の第 1 レベルのデータ構造のみをコピーすることに注意してください。オブジェクトまたは配列に参照型属性が含まれている場合、浅いコピーによってコピーされた新しいオブジェクトまたは配列は、これらの属性を元のオブジェクトまたは配列と共有します。 . .ディープ コピーを実装する必要がある場合は、他の方法を使用して操作する必要があります。

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

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

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLにおけるReactの役割:ユーザーエクスペリエンスの向上 HTMLにおけるReactの役割:ユーザーエクスペリエンスの向上 Apr 09, 2025 am 12:11 AM

ReactはJSXとHTMLを組み合わせてユーザーエクスペリエンスを向上させます。 1)JSXはHTMLを埋め込み、開発をより直感的にします。 2)仮想DOMメカニズムは、パフォーマンスを最適化し、DOM操作を削減します。 3)保守性を向上させるコンポーネントベースの管理UI。 4)国家管理とイベント処理は、インタラクティブ性を高めます。

ReactとFrontend:インタラクティブエクスペリエンスの構築 ReactとFrontend:インタラクティブエクスペリエンスの構築 Apr 11, 2025 am 12:02 AM

Reactは、インタラクティブなフロントエンドエクスペリエンスを構築するための好ましいツールです。 1)Reactは、コンポーネント化と仮想DOMを通じてUIの開発を簡素化します。 2)コンポーネントは、関数コンポーネントとクラスコンポーネントに分割されます。関数コンポーネントはよりシンプルで、クラスコンポーネントはより多くのライフサイクル方法を提供します。 3)Reactの作業原則は、パフォーマンスを改善するために仮想DOMおよび調整アルゴリズムに依存しています。 4)国家管理は、usestateまたはthis.stateを使用し、ComponentDidmountなどのライフサイクルメソッドが特定のロジックに使用されます。 5)基本的な使用には、コンポーネントの作成と状態の管理が含まれ、高度な使用にはカスタムフックとパフォーマンスの最適化が含まれます。 6)一般的なエラーには、不適切なステータスの更新とパフォーマンスの問題が含まれます。

反応コンポーネント:HTMLで再利用可能な要素を作成します 反応コンポーネント:HTMLで再利用可能な要素を作成します Apr 08, 2025 pm 05:53 PM

Reactコンポーネントは、機能またはクラスによって定義され、UIロジックのカプセル化、およびプロップを介して入力データを受け入れることができます。 1)コンポーネントの定義:関数またはクラスを使用して、反応要素を返します。 2)レンダリングコンポーネント:Reactコールレンダリングメソッドまたは機能コンポーネントを実行します。 3)マルチプレックスコンポーネント:データをプロップに渡して、複雑なUIを構築します。コンポーネントのライフサイクルアプローチにより、ロジックをさまざまな段階で実行でき、開発効率とコードメンテナビリティが向上します。

反応とフロントエンドスタック:ツールとテクノロジー 反応とフロントエンドスタック:ツールとテクノロジー Apr 10, 2025 am 09:34 AM

Reactは、コアコンポーネントと状態管理を備えたユーザーインターフェイスを構築するためのJavaScriptライブラリです。 1)コンポーネントと州の管理を通じてUIの開発を簡素化します。 2)作業原則には和解とレンダリングが含まれ、React.memoとusememoを通じて最適化を実装できます。 3)基本的な使用法は、コンポーネントを作成およびレンダリングすることであり、高度な使用法にはフックとコンテキストアピの使用が含まれます。 4)不適切なステータスの更新などの一般的なエラーでは、ReactDevtoolsを使用してデバッグできます。 5)パフォーマンスの最適化には、React.MEMO、仮想化リスト、コードスプリッティの使用が含まれ、コードを読みやすく保守可能に保つことがベストプラクティスです。

Reactのエコシステム:ライブラリ、ツール、およびベストプラクティス Reactのエコシステム:ライブラリ、ツール、およびベストプラクティス Apr 18, 2025 am 12:23 AM

Reactエコシステムには、状態管理ライブラリ(Reduxなど)、ルーティングライブラリ(Reactrouterなど)、UIコンポーネントライブラリ(材料-UIなど)、テストツール(JESTなど)、およびビルディングツール(Webpackなど)が含まれます。これらのツールは、開発者がアプリケーションを効率的に開発および維持し、コードの品質と開発効率を向上させるのを支援するために協力します。

TypeScriptをReactで使用することの利点は何ですか? TypeScriptをReactで使用することの利点は何ですか? Mar 27, 2025 pm 05:43 PM

タイプスクリプトは、タイプの安全性を提供し、コードの品質を改善し、IDEサポートを改善し、エラーを減らし、保守性を向上させることにより、反応開発を促進します。

React vs.バックエンドフレームワーク:比較 React vs.バックエンドフレームワーク:比較 Apr 13, 2025 am 12:06 AM

Reactは、ユーザーインターフェイスを構築するためのフロントエンドフレームワークです。バックエンドフレームワークは、サーバー側のアプリケーションを構築するために使用されます。 Reactはコンポーネントで効率的なUIアップデートを提供し、バックエンドフレームワークは完全なバックエンドサービスソリューションを提供します。テクノロジースタックを選択するときは、プロジェクトの要件、チームのスキル、およびスケーラビリティを考慮する必要があります。

Reactを使用したフロントエンド開発:利点とテクニック Reactを使用したフロントエンド開発:利点とテクニック Apr 17, 2025 am 12:25 AM

Reactの利点は、その柔軟性と効率性であり、これは以下に反映されています。1)コンポーネントベースの設計により、コードの再利用性が向上します。 2)仮想DOMテクノロジーは、特に大量のデータ更新を処理する場合、パフォーマンスを最適化します。 3)リッチエコシステムは、多数のサードパーティライブラリとツールを提供します。 Reactがどのように機能し、例を使用するかを理解することにより、そのコアコンセプトとベストプラクティスをマスターして、効率的で保守可能なユーザーインターフェイスを構築できます。

See all articles