javascript undefinedを判定する

javascript undefinedを判定する

javascriptで、undefinedを判定するサンプルコードを記述してます。「typeof」と「toString.call」を使用する2種類の方法があります。パフォーマンスは「typeof」の方が良いです。ブラウザはchromeを使用してます。

環境

  • OS windows11 home
  • Apache 2.4.43
  • ブラウザ chrome 108.0.5359.72

undefinedを判定

undefined」を判定するには、「typeof」を使用して判定します。

console.log( typeof undefined === 'undefined' ) // true

console.log( typeof null === 'undefined' ) // false
console.log( typeof '' === 'undefined' ) // false
console.log( typeof 0 === 'undefined' ) // false
console.log( typeof true === 'undefined' ) // false
console.log( typeof false === 'undefined' ) // false
console.log( typeof NaN === 'undefined' ) // false

「void 0」や、何も定義されていない変数は「undefined」が返ってくるので「true」になります。

console.log( typeof void 0 === 'undefined' ) // true

let foo;

console.log( typeof foo === 'undefined' ) // true

undefinedと比較

undefinedと比較しても結果は変わりませんが、

console.log( undefined === undefined ) // true

console.log( null === undefined ) // false
console.log( '' === undefined ) // false
console.log( 0 === undefined ) // false
console.log( true === undefined ) // false
console.log( false === undefined ) // false
console.log( NaN === undefined ) // false

変数として使用できるパターンもあるので「typeof」で比較した方が安全です。

(function(){
  let undefined = 0; // 変数として使用

  console.log(undefined);

  console.log( undefined === undefined ) // true

  console.log( null === undefined ) // false
  console.log( '' === undefined ) // false
  console.log( 0 === undefined ) // true
  console.log( true === undefined ) // false
  console.log( false === undefined ) // false
  console.log( NaN === undefined ) // false

})();

toString.call

「toString.call」を使用して判定することもできます。

console.log( toString.call(undefined).slice(8, -1) === 'Undefined' );  // true
console.log( toString.call(void 0).slice(8, -1) === 'Undefined' );  // true

let foo;
console.log( toString.call(foo).slice(8, -1) === 'Undefined' );  // true

console.log( toString.call(null).slice(8, -1) === 'Undefined' );  // false
console.log( toString.call('').slice(8, -1) === 'Undefined' );  // false
console.log( toString.call(0).slice(8, -1) === 'Undefined' );  // false
console.log( toString.call(false).slice(8, -1) === 'Undefined' );  // false
console.log( toString.call(false).slice(8, -1) === 'Undefined' );  // false
console.log( toString.call(NaN).slice(8, -1) === 'Undefined' );  // false

パフォーマンスは「typeof」の方がいいです。
以下は、同じ処理を100万回実行した実行時間です。

実行回数:1000000回 関数名:typeof   実行時間:1.20(ms)
実行回数:1000000回 関数名:toString.call 実行時間:29.2(ms)