JavaScriptで変数の型や存在するかどうかなどを調べるパターンをいくつか試してみます。
サンプルコード
変数が存在するかどうか
まずは変数が存在するかどうかです。
変数が定義されていない状態で使用しようとすると、エラーになります。
console.log(sample); // Uncaught ReferenceError: sample is not defined
変数が定義されているかどうかを調べる場合、typeofを使用します。
console.log(typeof sample); // undefined
if(typeof sample === 'undefined') {
console.log('未定義です');
} else {
console.log(sample + 'です');
}
typeof 変数名 で変数が定義されてない場合はundefinedにが返ってくるので、その値で判別します。
変数が定義されているかどうかを調べるデモページ
変数がnullかどうか
次に変数がnullかどうかです。
先ほど使用したtypeofを使用するとよさそうですが、返ってくる値はnullではなくobjectになります。
const sample = null; console.log(typeof sample); // object
そのため、typeofで判別しようとすると逆の判別になってしまします。
const sample = null;
if(typeof sample === 'null') {
console.log('型はnullです');
} else {
console.log('値は' + sample + 'です'); // こちらになる
}
nullの場合はtypeofを使わず、変数がnullかどうかで判別すればOKです。
const sample = null;
if(sample === null) {
console.log('型はnullです'); // こちらになる
} else {
console.log('値は' + sample + 'です');
}
関数が存在するかどうか
次に関数が存在するかどうかです。
関数の場合はtypeofを使用するとfunctionが返ってくるので、その値で判別できます。
if(typeof sample === 'function') {
console.log('functionです');
} else {
console.log('functionではないです'); // こちらになる
}
関数がない場合はtypeof で undefined が返ってくるので、関数でない方の判別になります。
関数が存在するかどうかのデモページ
関数が定義されている場合は、関数の判別になります。
const sample = function() {
console.log('sample');
}
if(typeof sample === 'function') {
console.log('functionです'); // こちらになる
} else {
console.log('functionではないです');
}
変数がオブジェクト(連想配列)かどうか
前述のnullかどうかの判別でも試しましたが、typeof で object を返す値にはnullや配列も含まれます。
const sample1 = {
name: "suzuki"
};
console.log(typeof sample1); // object
const sample2 = [1, 3, 5];
console.log(typeof sample2); // object
const sample3 = null;
console.log(typeof sample3); // object
const sample4 = new Date();
console.log(typeof sample4); // object
const sample5 = /aaa/;
console.log(typeof sample5); // object
これだと連想配列かどうかの判別ができないので、代わりに Object.prototype.toString.call を使って判別してみます。
const sample1 = {
name: "suzuki"
};
console.log(variable_type(sample1)); // object
const sample2 = [1, 3, 5];
console.log(variable_type(sample2)); // array
const sample3 = null;
console.log(variable_type(sample3)); // null
const sample4 = new Date();
console.log(variable_type(sample4)); // date
const sample5 = /aaa/;
console.log(variable_type(sample5)); // regexp
function variable_type(obj) {
if(typeof obj === 'object') {
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
} else {
return typeof obj;
}
}
とりあえず試した範囲ですが、それぞれを判別できるようになりました。
連想配列かどうかを調べるデモページ
オブジェクトが空かどうか
次にオブジェクト(連想配列)が空かどうかです。
連想配列のプロパティを取得して、その数を調べることで空かどうかを判別できます。
const sample1 = {};
console.log(Object.keys(sample1).length === 0); // true
const sample2 = {
name: "suzuki"
};
console.log(Object.keys(sample2).length === 0); // false
オブジェクトに特定のプロパティがあるかどうか
次にオブジェクト(連想配列)内に特定のプロパティがあるかどうかです。
hasOwnProperty() でプロパティを持っているかどうかを調べられます。。
const sample = {
name: "suzuki"
};
console.log(sample.hasOwnProperty('name')); // true
console.log(sample.hasOwnProperty('age')); // false
コメントが承認されるまで時間がかかります。