VIDEO LESSON
JavaScriptのObject.is():NaNと符号付きゼロを区別して値を比較するの解説動画
再生時間 7:54動画を別のタブで開く ↗
動画の字幕・文字起こしを読む
再生中の字幕を濃い黒で表示し、一番上に追従します。字幕の行を選ぶと、その位置から再生できます。
- 0:00こんにちは。
- 0:00今回はジャバスクリプトのオブジェクト・イズを紹介します。
- 0:05これは、二つの値が同じかどうかを判定する、比較のためのメソッドです。
- 0:11普段の比較で十分な場面も多いのですが、数値には少し特殊なケースがあります。
- 0:17計算に失敗したことを表すナン同士や、符号だけが違うゼロです。
- 0:22オブジェクト・イズは、ナン同士を同じ値と扱い、正のゼロと負のゼロを区別します。
- 0:28この動画では、厳密等価演算子との違いから、変更検知への活用、オブジェクト比較の注意点までを、
- 0:33実行結果と一緒に学びます。
- 0:38何を同じと見なすかを自分で選べるようになるのが目標です。
- 0:42判断に迷ったら、まずこの二つのケースに当てはまるかを確認してみてください。
- 0:49まず、困りごとから見ます。
- 0:50計算結果を前回の値と比べて、変わったときだけ処理したい場面を考えてください。
- 0:56ところが厳密等価演算子では、ナンとナンを比べても結果はフォルスになり、計算できない状態が続いていても、
- 1:01毎回変化したように見えてしまいます。
- 1:07逆に、ゼロとマイナスゼロはトゥルーになり、符号が変わっても変化なしと判定されます。
- 1:13画面のとおり、オブジェクト・イズではナン同士がトゥルーに変わります。
- 1:18すべての比較を置き換える必要はありません。
- 1:21この二つのケースが問題になる場面でこそ、選ぶ意味があります。
- 1:26この小さなずれが、不要な再処理や、大切な変化の見逃しの原因になります。
- 1:31引数と戻り値を確認します。
- 1:33呼び出し方は、オブジェクト・イズに比べたい値を二つ渡すだけです。
- 1:38インスタンスを作らず、オブジェクトに直接指定して呼ぶ静的メソッドです。
- 1:44戻り値は真偽値で、同じ値ならトゥルー、異なる値ならフォルスです。
- 1:49画面の例では、数値の十二同士はトゥルー、文字列の十二と数値の十二は型が違うのでフォルスになりました。
- 1:57型の自動変換は行いません。
- 1:59数値以外も渡せて、文字列なら内容と順序を比べ、オブジェクトなら同じものを参照しているかを比べます。
- 2:07比較対象そのものを変更する処理もありません。
- 2:11なお、引数の順序を入れ替えても、比較の結果は変わりません。
- 2:15基本の実行例を読みます。
- 2:17変数オリジナルにカウントを持つオブジェクトを入れ、別の変数エイリアスに同じものを代入しました。
- 2:26この二つは同じオブジェクトを指しているので、比較結果はトゥルーです。
- 2:32一方、その場で新しく作った、見た目が同じオブジェクトと比べても、結果はフォルスになります。
- 2:40記事の完全な例では、数値、型の違う値、ナン、ゼロ、参照の八件を並べて確認しています。
- 2:48このコードは、ノード・ジェイエスの実機でも、記事の期待出力と完全に一致することを確認済みです。
- 2:57ブラウザーのコンソールでも同じ結果になります。
- 3:01結果の読み方を整理します。
- 3:03違いが出るのは二か所だけです。
- 3:04一つ目はナンです。
- 3:06厳密等価ではフォルスですが、オブジェクト・イズではトゥルーで、計算できないという状態が続いたことを、
- 3:10同じ状態として扱えます。
- 3:14二つ目は符号付きゼロです。
- 3:15厳密等価ではプラスゼロとマイナスゼロを区別できませんが、オブジェクト・イズではフォルスとなり、
- 3:19符号の変化を検出できます。
- 3:23この比較規則はセームバリューと呼ばれます。
- 3:25それ以外の値については、厳密等価とほぼ同じ結果になるので、違いはこの二点に絞って覚えてください。
- 3:32この対応だけを覚えておけば、結果の読み間違いは防げます。
- 3:35対応環境を確認します。
- 3:37オブジェクト・イズは、二千十五年九月から主要ブラウザー間で利用できる機能で、
- 3:42現在のクローム、エッジ、ファイアフォックス、サファリで使えます。
- 3:47ノード・ジェイエスでも利用でき、記事の実行対象は二十二系です。
- 3:51サンプルは標準のジャバスクリプトだけで、外部ライブラリーも通信も使いません。
- 3:57ただし、古いブラウザーや組み込み環境まで無条件に対応するわけではありません。
- 4:02画面のように、タイプオブで関数として存在するかを確認してから使うと、未対応の環境でもエラーを避けて案内できます。
- 4:10活用例を見ます。
- 4:12計算結果が次々に届くとき、変化したときだけ履歴を残せば、記録の量を減らせます。
- 4:19ここでは、五、五、ナン、ナン、ゼロ、マイナスゼロ、マイナスゼロ、八という八件の並びを処理します。
- 4:28方針は、ナンが続く場合は同じ状態と扱い、ゼロの符号が変われば記録することです。
- 4:35前回の値と現在の値をオブジェクト・イズで比べ、異なる場合だけ記録します。
- 4:41まだ記録がない状態を表す変数を別に用意しているのは、最初の入力を偶然の一致で省略しないためです。
- 4:50表示用の関数でも、負のゼロを見分けられるよう、同じ比較を使っています。
- 4:56外部ライブラリーは使わず、標準の機能だけで書ける例です。
- 5:01実行結果を読み解きます。
- 5:03八件の入力に対して、記録は五件だけになりました。
- 5:07重なった五とナンは、それぞれ一回だけ記録され、ゼロからマイナスゼロへの変化は、
- 5:12符号の違いとしてしっかり記録されています。
- 5:16最後の八も新しい値として残りました。
- 5:19この結果も、ノード・ジェイエスの実機出力と一致することを確認済みです。
- 5:25注意点として、ナンの発生回数自体を障害の分析に使う場合は、この方法で省略してはいけません。
- 5:32重複を省いてよい情報なのかを決めてから導入してください。
- 5:36省略のルールを先に決めることが大切です。
- 5:39大切な注意点です。
- 5:40名前にオブジェクトと付いていますが、プロパティの中身を一つずつ調べる関数ではありません。
- 5:47画面の例では、状態を別の変数に代入したあと、カウントを二に書き換えました。
- 5:53参照は変わっていないので比較はトゥルーのままで、前の変数から見たカウントも二になっています。
- 5:59つまり、この代入は過去の内容の保存にはなりません。
- 6:03変更検知に使うなら、変更前の数値を別に保持するか、オブジェクトを直接書き換えず、
- 6:08新しい参照へ置き換える設計にしてください。
- 6:12内容同士の比較が必要なら、対象の項目と比較の規則を自分で明示します。
- 6:17参照が同じかどうかと、内容が同じかどうかは、別の問いとして分けて考えてください。
- 6:23もう二つの制約を確認します。
- 6:25一つ目は小数の誤差です。
- 6:27レイ点イチ足すレイ点ニと、レイ点サンの比較はフォルスになります。
- 6:32浮動小数点の誤差を吸収する機能はないので、測定値などを比べる場合は、許容できる誤差の幅を別に設計してください。
- 6:40また、二つの値が同じと判定されても、業務で使える正しい値とは限りません。
- 6:45ナンを同じ状態と扱うことと、その値を保存してよいかは別の判断です。
- 6:50二つ目は処理の性質で、このメソッドは同期的に真偽値を返すため、非同期の後始末は不要です。
- 6:57ただし、引数として渡す式が例外を出せば、比較自体は実行されません。
- 7:01未対応環境への備えは、対応環境のセクションで紹介した存在確認がそのまま使えます。
- 7:07まとめです。
- 7:08オブジェクト・イズは、ナン同士を同じと扱い、符号付きゼロを区別する比較です。
- 7:15通常の比較をすべて置き換える必要はなく、厳密等価で困る二つのケースがあるときに選びます。
- 7:22導入の前に、扱うデータについて二つ決めてください。
- 7:26計算できない状態が続いたら同じと見なすか、そしてゼロの符号に意味があるかです。
- 7:33このルールがはっきりすれば、変更検知のような処理で迷わず使えます。
- 7:38練習として、ナンとマイナスゼロを含む小さな配列を用意し、記録される変化を予想してから実行してみてください。
- 7:47小さな例で結果を確かめる習慣が、比較の使い分けを確実にします。
- 7:52お疲れさまでした。
この動画で学べること
Object.is()の引数・戻り値と、厳密等価演算子との違いを解説。NaNや符号付きゼロの比較、変更検知の活用例、ブラウザーとNode.jsでの実行手順、参照比較の注意点を学びます。
解説記事・サンプルコードを読む:JavaScriptのObject.is():NaNと符号付きゼロを区別して値を比較する →