JavaScriptでオブジェクトにキーが存在するか確認する正しい方法
JavaScriptでは、オブジェクトの中に特定のキー(プロパティ)が存在するかどうかを判定したい場面が頻繁にあります。本記事では、まずよく見られる誤った判定方法とその問題点を確認し、その後で推奨される正しい方法を2つ紹介します。
誤った方法:undefinedとの比較
次のようなオブジェクトを例に考えてみましょう。
const obj = {
name: 'Rahul'
};
「fName」というキーが存在するかどうかを、次のように判定してしまうコードをよく見かけます。
if (!obj['fName']) {}
または
if (obj['fName'] === undefined) {}
一見すると正しそうに見えますが、実はどちらも誤りです。なぜでしょうか?
この例では「fName」というキーがそもそも存在しないため、結果的に期待どおりに動作しているだけです。しかし、仮に「fName」が意図的に false や undefined を値として持っていた場合はどうなるでしょうか。
const obj = {
name: 'Rahul',
fName: undefined // キー自体は存在する
};
この場合、「fName」というキーは実際には存在するにもかかわらず、上記の判定では「存在しない」という誤った結果になってしまいます。つまり、値が falsy(偽と評価される値)であるケースでは、この方法は破綻するのです。
正しい方法①:in演算子を使う
in 演算子は、指定したプロパティがオブジェクト内に存在するかどうかを判定できる標準的な構文です。
('fName' in obj); // 存在すれば true、しなければ false
結果がブール値(true / false)で返るため、if文などの条件分岐にそのまま組み込めるのも便利なポイントです。
正しい方法②:hasOwnProperty()メソッドを使う
Object.prototype.hasOwnProperty() メソッドを使用しても、オブジェクトが特定のキーを持っているかどうかを判定できます。
obj.hasOwnProperty('fName');
in演算子とhasOwnProperty()の違い
両者の違いは以下のとおりです。
- hasOwnProperty():呼び出し対象のオブジェクト自身が持つプロパティのみを判定対象とします。
- in演算子:オブジェクト自身のプロパティに加えて、プロトタイプチェーンを通じて継承されたプロパティも判定対象に含めます。
そのため、継承されたプロパティを除外して「そのオブジェクト自身のキーだけ」を厳密に調べたい場合は hasOwnProperty() を、継承プロパティも含めて広く存在を確認したい場合は in 演算子を使うのが適切です。用途に応じて使い分けることで、より安全で意図通りの判定が可能になります。
-
JavaScriptのオブジェクト初期化子とは?使い方をサンプルコードで解説
オブジェクト初期化子とは オブジェクト初期化子(Object Initializer)は、新しく生成したオブジェクトを初期化するための式です。波括弧 {} の中に、「プロパティ名」と「それに対応する値」のペアを0個以上、カンマ区切りで列挙して記述します。 これにより、変数宣言と同時にオブジェクトの中身を簡単に定義することができます。 以下は、JavaScriptでオブジェクト初期化子を使用したサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta chars
-
JavaScriptでキー押下を検出する最も簡単な方法
JavaScriptでキー入力(キープレス)を検出する最も簡単な方法は、onkeypressイベントハンドラを使うことです。 document.onkeypress 押されたキーはkeyCodeプロパティと照合されます。このプロパティは、onkeypressイベントを発生させたキーのUnicode文字コードを返します。たとえば、Enterキーであれば「13」という値になります。 コード例 以下は、Enterキーの押下を検出し、それ以外のキーが押された場合にはその文字をコンソールに表示するサンプルコードです。 <!DOCTYPE html> <html lang="