JavaScriptにおいて、関数に引数を渡す際、オブジェクトを引数として渡すことができます。オブジェクトを引数に取ることで、複数の情報を一つの変数でまとめて渡すことができます。
この記事では以下の内容を分かりやすく説明するように心掛けています。ご参考になれば幸いです。
- JavaScriptでオブジェクトを関数の引数に渡す方法
- 基本的な使い方
- オブジェクトを直接渡す方法
- オブジェクトを直接渡して、新たなオブジェクトを作成する方法
- プロパティ省略記法を用いない場合
- プロパティ省略記法を用いた場合
- 分割代入を利用したオブジェクトの各プロパティの参照方法
- 「オブジェクト」や「配列」が入れ子構造になっているオブジェクトを関数の引数に渡す場合
- 分割代入を用いない場合
- 分割代入を用いた場合
- デフォルト引数を用いて、デフォルト値を設定する方法
- オブジェクトを関数の引数に渡すメリット
JavaScriptでオブジェクトを関数の引数に渡す基本的な使い方
まず、基本的な使い方を説明します。以下のプログラムでは、オブジェクトを引数として関数に渡しています。
let personInfo = {
name: "Taro",
age: 30
};
function displayPersonInfo(person) {
console.log("Name: " + person.name);
console.log("Age: " + person.age);
}
displayPersonInfo(personInfo);
// ログ
// Name: Taro
// Age: 30
上記のプログラムでは、personInfo
オブジェクトをdisplayPersonInfo
関数の引数に渡しています。
personInfo
オブジェクトはname
プロパティとage
プロパティを持っており、displayPersonInfo
関数の内部でconsole.log
関数を用いて、各プロパティの値を参照しています。
オブジェクトを関数の引数に直接渡す方法
以下のプログラムに示すように、関数の呼び出し時に、直接オブジェクトを渡すこともできます。
function displayPersonInfo(person) {
console.log("Name: " + person.name);
console.log("Age: " + person.age);
}
displayPersonInfo({ name: "Taro", age: 30 }); //直接オブジェクトを渡している
// ログ
// Name: Taro
// Age: 30
上記のプログラムでは、{ name: "Taro", age: 30 }
をdisplayPersonInfo
関数の引数に直接渡しています。
この方法は、関数が引数として受け取るオブジェクトの形状(プロパティの名前やデータ型)が明確で、その関数を呼び出して、新たなオブジェクトを作成する場合に便利です。次に、新たなオブジェクトを作成しているプログラム例を説明します。
オブジェクトを直接渡して、新たなオブジェクトを作成する方法
以下のプログラムでは、関数を呼び出して、新たなオブジェクトを作成しています。
function wrapInPayload(person) {
return { payload: person }; //新たなオブジェクトを作成している
}
const result = wrapInPayload({ name: "Taro", age: 30 });
console.log(result);
// ログ
// { payload: { name: 'Taro', age: 30 } }
wrapInPayload
関数は、「引数として渡されたオブジェクト」を「payload
プロパティの値として持つ新しいオブジェクト」を作成して返しています。
上記のプログラムでは、wrapInPayload
関数に{ name: "Taro", age: 30 }
を渡しており、関数内部で{ payload: { name: 'Taro', age: 30 } }
という新しいオブジェクトを作成して、返しています。その返り値は定数result
に格納されています。
プロパティ省略記法について
JavaScriptでは、オブジェクトのプロパティ名とその値の変数名が同じ場合、そのプロパティの値を省略することができます。これはプロパティ省略記法(Property Shorthand)といいます。
以下のプログラムでは、関数の引数名がpayload
となっており、その引数名payload
を関数内部で、payload
プロパティの値にして返しています。
function wrapInPayload(payload) {
return { payload }; // 「関数の引数名(payload)」と「プロパティの値(payload)」が同じの場合、このように記述できる
}
const result = wrapInPayload({ name: "Taro", age: 30 });
console.log(result);
// ログ
// { payload: { name: 'Taro', age: 30 } }
このように、プロパティ省略記法は、「関数の引数名(payload)」と「プロパティの値(payload)」が一致するときに有効で、そのような場合にコードをより簡潔に書くことができます。つまり、以下の2つのコードは同じ動作をします。
// 省略記法を用いない場合
function wrapInPayload(payload) {
return { payload: payload };
}
// 省略記法を用いた場合
function wrapInPayload(payload) {
return { payload };
}
プロパティ省略記法を用いることで、コードをより簡潔に書くことができます。ただし、これは可読性に影響を及ぼすこともあるので、適切な場面で使うことが重要です。
「プロパティ省略記法(Property Shorthand)」は「オブジェクトリテラルの省略記法」、「オブジェクトリテラルプロパティ値の省略記法」、「オブジェクトリテラルプロパティ名の省略記法」とも呼ばれています。この記法はJavaScript ES6(ECMAScript 2015)以降で導入されました。
分割代入を利用したオブジェクトの各プロパティの参照方法
JavaScriptには分割代入(Destructuring assignment)という便利な機能があります。
関数の引数に分割代入を利用すると、渡されたオブジェクトから特定のプロパティを取り出すことができます。
以下のプログラムは分割代入を利用したプログラム例です。
let personInfo = {
name: "Taro",
age: 30
};
function displayPersonInfo({ name }) {
console.log("Name: " + name);
}
displayPersonInfo(personInfo);
// ログ
// Name: Taro
上記のプログラムでは、personInfo
オブジェクトをdisplayPersonInfo
関数の引数に渡しています。
personInfo
オブジェクトはname
プロパティとage
プロパティを持っています。
displayPersonInfo
関数では、分割代入を利用しており、関数定義時の引数を{ name }
と書くことで、personInfo
オブジェクトからname
プロパティのみを直接取り出しています。
このように、分割代入でプロパティ名(上記のプログラムでは、name
)を指定すれば、プロパティに対応する値(Taro
)が引数name
に格納された状態で関数が実行されます。
なお、name
プロパティもage
プロパティも取り出す場合には、以下の様に記述します。
let personInfo = {
name: "Taro",
age: 30
};
function displayPersonInfo({ name, age }) {
console.log("Name: " + name);
console.log("Age: " + age);
}
displayPersonInfo(personInfo);
// ログ
// Name: Taro
// Age: 30
「オブジェクト」や「配列」が入れ子構造になっているオブジェクトを関数の引数に渡す場合
「オブジェクト」や「配列」が入れ子構造になっているオブジェクトも関数の引数に渡すことができます。これにより、より複雑なデータ構造を関数に渡すことが可能になります。
分割代入を用いない場合
let personInfo = {
name: { first: "Taro", last: "Yamada" },
age: 30,
hobbies: ["tennis", "soccer"], //配列が入れ子構造になっている
pets: [
{ type: "Dog", name: "Pochi" }, //配列とオブジェクトが入れ子構造になっている
{ type: "Cat", name: "Tama" }
]
};
function displayPersonInfo(person) {
console.log("Name: " + person.name.last + person.name.first);
console.log("Age: " + person.age);
console.log("Hobbies:");
for (let hobby of person.hobbies) {
console.log(" - " + hobby);
}
console.log("Pets:");
for (let pet of person.pets) {
console.log(" - " + pet.type + ": " + pet.name);
}
}
displayPersonInfo(personInfo);
// ログ
// Name: YamadaTaro
// Age: 30
// Hobbies:
// - tennis
// - soccer
// Pets:
// - Dog: Pochi
// - Cat: Tama
分割代入を用いる場合
分割代入を用いると、以下のように記述することができます。
let personInfo = {
name: { first: "Taro", last: "Yamada" },
age: 30,
hobbies: ["tennis", "soccer"], //配列が入れ子構造になっている
pets: [
{ type: "Dog", name: "Pochi" }, //配列とオブジェクトが入れ子構造になっている
{ type: "Cat", name: "Tama" }
]
};
function displayPersonInfo({ name: { first, last }, age, hobbies, pets}) {
console.log("Name: " + last + first);
console.log("Age: " + age);
console.log("Hobbies:");
for (let hobby of hobbies) {
console.log(" - " + hobby);
}
console.log("Pets:");
for (let pet of pets) {
console.log(" - " + pet.type + ": " + pet.name);
}
}
displayPersonInfo(personInfo);
// ログ
// Name: YamadaTaro
// Age: 30
// Hobbies:
// - tennis
// - soccer
// Pets:
// - Dog: Pochi
// - Cat: Tama
デフォルト引数を用いて、デフォルト値を設定する方法
JavaScriptの関数では、デフォルト引数と呼ばれる機能を用いることができます。
デフォルト引数を設定すると、関数実行時に引数が渡されなかった場合や、一部のプロパティしか持たないオブジェクトが渡された場合、関数はデフォルト値(初期値)を使って正常に実行されます。
function displayPersonInfo({ name = "No name", age = 0 } = {}) {
console.log("Name: " + name);
console.log("Age: " + age);
}
// オブジェクトを引数に渡さない場合
displayPersonInfo();
// ログ
// Name: No name
// Age: 0
// 一部のプロパティを持つオブジェクトを引数に渡す場合
displayPersonInfo({ name: "Taro"});
// ログ
// Name: Taro
// Age: 0
上記のプログラムでは、displayPersonInfo
関数はデフォルト値を設定した2つのプロパティ(name
とage
)を持つオブジェクトを引数として受け取っています。
デフォルト値を設定しない場合、「undefined
」となります。
function displayPersonInfo({ name, age } = {}) {
console.log("Name: " + name);
console.log("Age: " + age);
}
// オブジェクトを引数に渡さない場合
displayPersonInfo();
// ログ
// Name: undefined
// Age: undefined
// 一部のプロパティを持つオブジェクトを引数に渡す場合
displayPersonInfo({ name: "Taro" });
// ログ
// Name: Taro
// Age: undefined
オブジェクトを関数の引数に渡すメリット
オブジェクトを関数の引数に渡すメリットを以下に示します。
メリット
- オブジェクトを関数の引数として渡すことで、関数が必要とするデータを一つの変数にまとめることができる。
- 関数の定義や呼び出しがシンプルになる。ットの特徴
- オブジェクトのプロパティは順不同であり、順番を気にする必要がない。
- オブジェクトを関数の引数に利用しない場合、以下のようにプログラムを記述することになります。
オブジェクトを関数の引数に利用しない場合、以下のようにプログラムを記述することになります。
let personName = "Taro";
let personAge = 30;
function displayPersonInfo(name, age) {
console.log("Name: " + name);
console.log("Age: " + age);
}
displayPersonInfo(personName, personAge);
// ログ
// Name: Taro
// Age: 30
上記のプログラムの場合、引数が増えてくると管理が難しくなりますし、引数の順序も気にする必要があります。例えば、「displayPersonInfo(name, age)
」を「displayPersonInfo(age, name)
」にしていた場合(引数の順序を間違えた場合)、console.log
関数にて出力されるログは以下のようになります。
// ログ
// Name: 30
// Age: Taro
このように、引数の順番を間違えると、処理自体が意図したものにならないため、バグ混入につながります。
まとめ
この記事ではJavaScriptで『オブジェクトを関数の引数に渡す方法』について、以下の内容を説明しました。
- JavaScriptでオブジェクトを関数の引数に渡す方法
- 基本的な使い方
- オブジェクトを直接渡す方法
- オブジェクトを直接渡して、新たなオブジェクトを作成する方法
- プロパティ省略記法を用いない場合
- プロパティ省略記法を用いた場合
- 分割代入を利用したオブジェクトの各プロパティの参照方法
- 「オブジェクト」や「配列」が入れ子構造になっているオブジェクトを関数の引数に渡す場合
- 分割代入を用いない場合
- 分割代入を用いた場合
- デフォルト引数を用いて、デフォルト値を設定する方法
- オブジェクトを関数の引数に渡すメリット
お読み頂きありがとうございました。