JavaScript では、プリミティブ と 参照型 という 2 つの基本的な種類のデータが変数に格納されます。これら 2 つのタイプの違いを理解することは、メモリ管理と、データの共有、保存、変更の制御にとって不可欠です。この記事では、これらの違いを詳しく掘り下げ、実際の例を示し、両方の種類を効率的に処理する方法を検討します。
最も単純な種類のデータはプリミティブと呼ばれます。変更不可能なデータを変数に直接格納します。 JavaScript がサポートするプリミティブ型は次のとおりです:
主な特徴:
一方、参照型はオブジェクトのメモリ位置を保存します。変数は実際の値を保存するのではなく、メモリ アドレスへの参照を保存します。例としては次のとおりです。
主な特徴:
// Primitive Example let a = 10; let b = a; b = 20; console.log(a); // Output: 10 // Reference Example let obj1 = { name: 'Alice' }; let obj2 = obj1; obj2.name = 'Bob'; console.log(obj1.name); // Output: 'Bob'
参照型を使用する場合は、mutation と assignment の違いを理解することが重要です。
// Primitive Example let a = 10; let b = a; b = 20; console.log(a); // Output: 10 // Reference Example let obj1 = { name: 'Alice' }; let obj2 = obj1; obj2.name = 'Bob'; console.log(obj1.name); // Output: 'Bob'
let arr = [1, 2, 3]; let arr2 = arr; arr2.push(4); console.log(arr); // Output: [1, 2, 3, 4]
オブジェクトまたは配列の別のコピーを作成するには、スプレッド演算子 (...) または Object.assign() を使用します。
let arr = [1, 2, 3]; let arr2 = arr; arr2 = [4, 5, 6]; console.log(arr); // Output: [1, 2, 3]
ネストされたオブジェクトの場合、ディープコピーが必要です。一般的なアプローチは、JSON.parse(JSON.stringify()).
を使用することです。
let original = { name: 'Alice' }; let copy = { ...original }; copy.name = 'Bob'; console.log(original.name); // Output: 'Alice'
関数にプリミティブを渡すとき、値のコピーが渡されます。
let nested = { person: { name: 'Alice' } }; let deepCopy = JSON.parse(JSON.stringify(nested)); deepCopy.person.name = 'Bob'; console.log(nested.person.name); // Output: 'Alice'
参照型を渡す場合、メモリの場所への参照が渡されます。
function modifyValue(x) { x = 20; } let num = 10; modifyValue(num); console.log(num); // Output: 10
プリミティブは不変ですが、JavaScript はプリミティブを一時的にオブジェクトにラップして、メソッドやプロパティへのアクセスを許可します。
function modifyObject(obj) { obj.name = 'Bob'; } let person = { name: 'Alice' }; modifyObject(person); console.log(person.name); // Output: 'Bob'
文字列プリミティブ「hello」は、length プロパティにアクセスするために一時的に String オブジェクトにラップされます。ラッパーは操作後に破棄されます。
let str = 'hello'; console.log(str.length); // Output: 5
意図しない突然変異を避ける:
独立したコピーが必要な場合は、必ずスプレッド演算子またはディープ コピー手法を使用してコピーを作成してください。
ディープコピーをいつ使用するかを知る:
浅いオブジェクトの場合はスプレッド演算子で十分ですが、ネストされた構造では参照の問題を回避するために深いコピーが必要です。
不変性の活用:
Immutable.js などのライブラリを使用するか、関数型プログラミング手法を採用して、意図しない突然変異によって引き起こされるバグを最小限に抑えます。
変異を伴う紛らわしい代入:
オブジェクトを変更しているのか、参照を再割り当てしているのかに注意してください。
共有参照の変更:
共有オブジェクトへの変更は、プログラムの他の部分でも使用されている場合、予期せぬ結果を招く可能性があります。
すべてのコピーが独立していると仮定します:
浅いコピーでは、ネストされた構造の変更を防ぐことができないことに注意してください。
JavaScript の中心的な考え方の 1 つは、プリミティブ と 参照型 の区別です。これは、関数へのデータの送信方法、変数の管理方法、コード内の予期しない副作用の防止方法に影響します。これらのアイデアを理解し、ベスト プラクティスを使用することで、より信頼性が高く保守しやすい JavaScript コードを構築できます。
Github Linkedin でフォローしてください
以上がJavaScript 変数: プリミティブと参照型を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。