JavaScriptの値渡しとは?オブジェクト参照の仕組みを実例で解説
JavaScriptは基本的に値渡し(pass by value)の言語です。しかし、オブジェクトを扱う場合には注意が必要です。オブジェクトにとっての「値」とは、そのオブジェクトへの参照(リファレンス)そのものだからです。
プリミティブ型の場合:関数内での変更は呼び出し元に影響しない
例えば、数値を関数に引数として渡し、その関数の中で値をインクリメントしても、呼び出し元の変数の値は更新されません。
コード例
let i = 0;
function increment(x) {
x = x + 1
console.log(x)
}
increment(i)
console.log(i)
実行結果
1 0
オブジェクトの場合:参照の再代入と内部状態の変更は挙動が異なる
オブジェクトを渡した場合、関数内でそのオブジェクトの参照自体を別のものに差し替えても、元のオブジェクトには影響しません。しかし、オブジェクトの内部(プロパティなど)を変更すると、その変更は元のオブジェクトにも反映されます。
コード例
let obj = {'foo': 'bar'};
function updateRef(x) {
// xのローカルな参照が更新されるだけで、objには影響しない
x = {}
}
function addHelloWorld(y) {
// yが参照しているオブジェクトに新しいプロパティを追加
y['hello'] = 'world';
}
console.log(obj)
updateRef(obj)
console.log(obj)
addHelloWorld(obj)
console.log(obj)
実行結果
{ foo: 'bar' }
{ foo: 'bar' }
{ foo: 'bar', hello: 'world' }
ポイントのまとめ
最初の関数updateRefでは、引数xというローカル変数が新しい空のオブジェクトに再代入されただけのため、元のobjには何の影響もありませんでした。一方、2つ目の関数addHelloWorldでは、引数yがobjと同じオブジェクトを参照していたため、その内部状態(プロパティ)を変更すると、元のオブジェクトにも変更が反映されました。
このようにJavaScriptでは、プリミティブ型は値そのものがコピーされて渡される一方、オブジェクトは「参照という値」が渡されるため、関数内での操作によって挙動が大きく異なります。この違いを理解しておくことは、バグを防ぎ、正しくコードを設計する上で非常に重要です。
-
JavaScriptのRegExp(正規表現)オブジェクトとは?基本の使い方をわかりやすく解説
RegExp(正規表現)オブジェクトは、テキストに対してパターンマッチングを行い、目的の文字列部分を検索・抽出するために使用されます。JavaScriptでは、RegExpオブジェクトを「RegExpコンストラクタ」または「リテラル構文」の2通りの方法で作成できます。 RegExpオブジェクトの作成方法 コンストラクタを使用する場合: new RegExp(pattern) リテラル構文を使用する場合: /pattern/ 主なメソッド test():文字列がパターンに一致するかどうかを真偽値(true / false)で返します。 exec():パターンに一致した文字列を返します。
-
JavaScriptのオブジェクト初期化子とは?使い方をサンプルコードで解説
オブジェクト初期化子とは オブジェクト初期化子(Object Initializer)は、新しく生成したオブジェクトを初期化するための式です。波括弧 {} の中に、「プロパティ名」と「それに対応する値」のペアを0個以上、カンマ区切りで列挙して記述します。 これにより、変数宣言と同時にオブジェクトの中身を簡単に定義することができます。 以下は、JavaScriptでオブジェクト初期化子を使用したサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta chars