Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Object.is in JavaScript ⚡ The Equality Check Nobody Talks About 🤯

2025年09月27日に「Dev.to」が公開したITニュース「Object.is in JavaScript ⚡ The Equality Check Nobody Talks About 🤯」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

JavaScriptの`Object.is`は、`==`や`===`に続く値の比較方法だ。`===`では`NaN`同士が等しくなく、`+0`と`-0`が等しいという特殊な挙動があるが、`Object.is`はこれらを正しく判定する。ES6で導入され、Reactの効率的な更新など、厳密な比較が必要な場面で活用される。

ITニュース解説

JavaScriptで二つの値が等しいかどうかを比較する方法はいくつか存在する。一般的には == (ゆるい等価性) と === (厳格な等価性) がよく知られているが、ES2015(ES6)というJavaScriptの新しいバージョンで Object.is という、さらに厳密な比較を行うための機能が導入された。システムエンジニアを目指す上で、これらの比較方法の違いを理解することは、予期せぬバグを防ぎ、より堅牢なコードを書くために非常に重要である。

まず、ほとんどの場面で推奨されるのは === である。この厳格な等価性比較演算子は、二つの値が「型」も「値」も同じ場合にのみ true を返す。例えば、数値の 5 と文字列の "5" を比較した場合、5 === "5" は型が異なるため false となる。これに対し、== は型が異なる場合、JavaScriptが自動的に型を変換(型強制)してから比較を行うため、5 == "5"true となる。この型強制の挙動が、しばしば意図しない結果を引き起こす原因となるため、安全なプログラミングのためには === の利用が推奨される。

しかし、この信頼性の高い === であっても、二つの特殊なケースにおいて、その挙動が少し意外に感じられることがある。一つ目は NaN (Not a Number、数ではない) という特殊な値の比較である。NaN は、00 で割るなど、不正な数値演算の結果として生成されることがある値である。JavaScriptでは、この NaN が自分自身とすら等しくないと判断される。つまり、NaN === NaN と書くと false になるのである。これは、ある変数が NaN であるかどうかを正確にチェックしたい場合に、少し不便な点となる。

二つ目は +0 (正のゼロ) と -0 (負のゼロ) の比較である。これらは数値としては同じ 0 を表すものの、JavaScriptの内部では異なる符号を持つ値として扱われることがある。=== を使って比較すると、+0 === -0true と判断される。しかし、特定の数学的な計算や、ごくまれな物理シミュレーションのような精密なアプリケーションでは、この符号の違いを厳密に区別する必要があるケースが存在する。

これらの === の持つ「特殊な挙動」を解決するために、より厳密で予測可能な比較を提供することを目的として Object.is が導入された。Object.is は、基本的に === と同じように厳格な比較を行うが、前述の二つのエッジケースにおいてのみ、=== とは異なる結果を返すように設計されている。

具体的に見ていくと、Object.isNaN を自分自身と等しいと判断する。つまり、Object.is(NaN, NaN) と書けば true になる。これにより、ある値が NaN であるかどうかを正確に確認したい場合に、Object.is を利用することが可能となり、NaN の検出が容易になる。

また、Object.is+0-0 を異なる値として判断する。つまり、Object.is(+0, -0) と書けば false になる。これで、値の符号まで含めて厳密に比較したい場合に、+0-0 を正確に区別することが可能となる。

したがって、Object.is は型強制を行わず、異なる型は常に false と判断する点で === と共通している。しかし、NaN 同士の比較で true を返し、+0-0 の比較で false を返すという二点において、=== とは異なる振る舞いをするのである。その他の一般的な値の比較では、Object.is=== とまったく同じ結果を返す。

Object.is は、日常のほとんどのプログラミング作業で頻繁に直接使用する機会は少ないかもしれないが、その特定の特性が非常に重要な役割を果たす場面がある。例えば、ある変数に格納されている値が NaN であることを確実にチェックしたい場合、Object.is(myValue, NaN) と記述することで、他の方法よりもシンプルかつ正確に判定できる。同様に、+0-0 を厳密に区別する必要がある場面では、Object.is を使うことでその違いを正確に把握できる。

さらに Object.is は、ReactのようなモダンなJavaScriptフレームワークの内部でパフォーマンス最適化のために広く利用されている。Reactは、コンポーネントの状態(state)やプロパティ(props)が変更された場合にのみ、画面の再描画(再レンダリング)を行うことで、不要な処理をスキップし、アプリケーションの動作を高速化している。この「変更されたかどうか」のチェックに Object.is が使われている。

例えば、Reactの useState フックを使って、コンポーネントの状態を管理している場合を考えてみる。もし現在の状態が NaN であり、その NaN を再度 setCount(NaN) のように設定しようとしたとする。このとき、Reactは内部的に Object.is(古い値, 新しい値) を使って比較を行うため、Object.is(NaN, NaN)true となる。これにより、Reactは「値が変わっていない」と判断し、不要な再レンダリングを行わない。もしこの比較に NaN === NaNfalse となる === が使われていた場合、常に「値が変わった」と判断され、不必要な再レンダリングが頻繁にトリガーされてしまい、アプリケーションのパフォーマンスに悪影響を与えていた可能性がある。

また、React.memo という機能も Object.is を活用している。React.memo は、コンポーネントに渡されるプロパティが変化しない限り、そのコンポーネントの再レンダリングをスキップする機能である。ここでも、プロパティの変更を検出するために Object.is が内部的に使われており、NaN のプロパティを持つコンポーネントを React.memo でラップした場合、同じ NaN を渡しても「変更がない」と判断され、不必要な再レンダリングを防いでくれる。これは、アプリケーションの描画性能向上に直結する重要な最適化手法である。

このように Object.is は、JavaScriptにおける値の比較において、=== がカバーしきれない特定の「エッジケース」をより正確に扱うために導入された、小さくても非常に強力な機能である。普段意識して使うことは稀かもしれないが、その存在はReactのような大規模なライブラリやフレームワークのパフォーマンスを支えたり、特定の状況でバグを防いだりする上で不可欠な役割を担っている。システムエンジニアとしてJavaScriptを深く理解し、信頼性の高いアプリケーションを開発する上で、この Object.is の特性を把握しておくことは非常に重要である。

関連コンテンツ

関連ITニュース