空オブジェクト判定:for...inループ vs. Object.keys
JavaScriptで空のオブジェクトをテストする方法
Object.keys(obj).length === 0
オブジェクトの所有するキーの数を取得し、それが0かどうかを判定する方法です。最も簡潔で汎用性の高い方法ですが、オブジェクトにhasOwnProperty
プロパティが追加されている場合、誤判定される可能性があります。
const obj = {};
if (Object.keys(obj).length === 0) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
JSON.stringify(obj) === '{}'
オブジェクトをJSON形式に変換し、それが空の文字列かどうかを判定する方法です。hasOwnProperty
プロパティの影響を受けずに判定できますが、オブジェクトの循環参照があるとエラーが発生する可能性があります。
const obj = {};
if (JSON.stringify(obj) === '{}') {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
オブジェクトの所有するプロパティの名前を取得し、それが0かどうかを判定する方法です。hasOwnProperty
プロパティの影響を受けずに判定でき、循環参照の影響も受けません。
const obj = {};
if (Object.getOwnPropertyNames(obj).length === 0) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
for...in ループ
オブジェクトのプロパティをループ処理し、プロパティが存在しないことを確認する方法です。他の方法よりも処理速度が遅くなりますが、オブジェクトのすべてのプロパティを検査したい場合に有効です。
const obj = {};
let isEmpty = true;
for (const prop in obj) {
isEmpty = false;
break;
}
if (isEmpty) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
自作関数
上記の方法を組み合わせて、独自の判定関数を作成する方法です。状況に応じて、より柔軟な判定を行うことができます。
function isEmptyObject(obj) {
return Object.keys(obj).length === 0 &&
Object.getOwnPropertyNames(obj).length === 0;
}
const obj = {};
if (isEmptyObject(obj)) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
空のオブジェクトを判定する方法はいくつかあり、それぞれにメリットとデメリットがあります。状況に応じて適切な方法を選択することが重要です。
// 1. Object.keys(obj).length === 0
const obj1 = {};
if (Object.keys(obj1).length === 0) {
console.log('obj1は空のオブジェクトです');
} else {
console.log('obj1は空のオブジェクトではありません');
}
// 2. JSON.stringify(obj) === '{}'
const obj2 = {};
if (JSON.stringify(obj2) === '{}') {
console.log('obj2は空のオブジェクトです');
} else {
console.log('obj2は空のオブジェクトではありません');
}
// 3. Object.getOwnPropertyNames(obj).length === 0
const obj3 = {};
if (Object.getOwnPropertyNames(obj3).length === 0) {
console.log('obj3は空のオブジェクトです');
} else {
console.log('obj3は空のオブジェクトではありません');
}
// 4. for...in ループ
const obj4 = {};
let isEmpty = true;
for (const prop in obj4) {
isEmpty = false;
break;
}
if (isEmpty) {
console.log('obj4は空のオブジェクトです');
} else {
console.log('obj4は空のオブジェクトではありません');
}
// 5. 自作関数
function isEmptyObject(obj) {
return Object.keys(obj).length === 0 &&
Object.getOwnPropertyNames(obj).length === 0;
}
const obj5 = {};
if (isEmptyObject(obj5)) {
console.log('obj5は空のオブジェクトです');
} else {
console.log('obj5は空のオブジェクトではありません');
}
上記コードを実行すると、以下のような出力が得られます。
obj1は空のオブジェクトです
obj2は空のオブジェクトです
obj3は空のオブジェクトです
obj4は空のオブジェクトです
obj5は空のオブジェクトです
実行方法
上記コードをJavaScriptファイルに保存し、ブラウザで実行します。または、Node.jsなどのJavaScript実行環境で実行することもできます。
空のオブジェクトを判定する方法:その他の方法
Object.prototype.hasOwnProperty()
オブジェクトにプロパティが存在しないことを確認する方法です。ただし、hasOwnProperty
プロパティはオブジェクト自身に定義されているため、オブジェクトのプロパティを拡張している場合、誤判定される可能性があります。
const obj = {};
if (!obj.hasOwnProperty('prop')) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
Object.is()
ES2017で導入された、オブジェクトの同一性を比較する関数です。ただし、オブジェクトの参照が異なる場合は、たとえ内容が同じであっても、false
を返します。
const obj1 = {};
const obj2 = {};
if (Object.is(obj1, obj2)) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
lodash.isEmpty()
Lodashなどのライブラリを使用する場合は、isEmpty
関数を使用して空のオブジェクトを判定できます。
const _ = require('lodash');
const obj = {};
if (_.isEmpty(obj)) {
console.log('空のオブジェクトです');
} else {
console.log('空のオブジェクトではありません');
}
javascript javascript-objects