Falsy Value 〜暗黙的なタイプ変換〜

1 min読了の目安(約1300字TECH技術記事

です!
最近よく使うようになってきたJSについて新しい発見。

Javascriptではあるバイナリー(Boolean)型が必要な文脈においては、データ型がバイナリー型に変換されるようです。

値がfalse(0)となるように変換される場合、この値をFalsy Valueと呼びます。

Falsy Value

例)if 条件式

if (null)
if (undefined)
if (0)
if (-0)
if (0n)
if (NaN)
if ("")

このようなコンテキストでは全てが`false`となるよう。
他にも論理演算子(&& ||)やループの条件式でもFalsyになりますね。

Falsy Value の種類

JavascriptにおけるFalsy Valueには8種類。

Type Detail
false ボス
0, -0 整数の0
0n, -0n BigInt*の0
"", '', `` 空のString
null 値なし
undefined メソッドを持たず変更不可
NaN "Not a Number"
document.all having [[IsHTMLDDA]] internal slot(これ何?)

BigInt:2^53 - 1より大きな値を表すためのデータ型

コンソールで試してみた

>0 == false
<< true

>0n == false
<< true

>"" == false
<< true

>null == false
<< false

>undefined == false
<< false

>NaN == false
<< false

null,undefined,NaNは変換がされていない。なんで?

不規則な変換ルール

https://jsprimer.net/basic/implicit-coercion/

こちらの記事にあるテーブルが非常に参考になりました。
True/Falseテーブルによると、

"null == undefined"はtrueを返してくれます。

ただこのルールによって起こり得るエラーを避けるためには、厳密等価演算子(===)を使用できます。

>0 == false
<< true

>0 === false
<< false

>null == undefined
<< true

>null === undefined
<< false

型変換は無視して実際の型で比較してくれます。

SOTD

頻繁に使用しているデータ型なので、"falsy value"の概念は知らなくともなんとなく使っていました。"falsy value"には型変換をされた後に、一致するのもとしないものとでまた別れているという点が気になりますね。