JavaScript クイズに敗北した
JavaScript クイズ解説: NaN === NaN の結果はどうなる?
知ってるぞ!NaN === NaN
は false になるんだぜ!とドヤ顔で false だと思ったら見事に爆散しました。
true になることあるの……?と思ったけど、true にも false にもそれ以外にもなるのか……と思って記事を読みました。
===
以外のやつも false になるのは知らなかった。
// 記事から引用
console.log(NaN === NaN) // → false
console.log(NaN > NaN) // → false
console.log(NaN >= NaN) // → false
console.log(NaN < NaN) // → false
console.log(NaN <= NaN) // → false
console.log(NaN !== NaN) // → true
ビット表現
NaN と Infinity のビット表現の件は、勉強不足であまり理解できなかった……。
Number.isNaN とグローバルの isNaN
isNaN
の件、そもそもNumber.isNaN
しか知らなくて、グローバルオブジェクトにisNaN
あるのか……というのを初めて知りました。
違いは、
- Number.isNaN => 入力が NaN そのものであった場合のみ true を返す
- グローバルの isNaN => 入力を数値に変換すると NaN になる場合に true を返す
グローバルのisNaN
の場合、引数に string とか渡すと true になるらしい。知らなかった。
NaN === NaN が true になる場合
そもそも NaN や null などはグローバルオブジェクトに[[Writable]]: false
で定義されているらしい。
で、それを上書きすることはできないけど、ローカルスコープを作ってやれば上書きできるとのこと。
もちろんこんなコードは書かないけど、いざ見てみるとconst undefined = 7
みたいな頭がバグりそうなコードがあって面白い。
with 構文を使えば NaN === NaN で例外を出せる
with
構文、初めて知りました。
MDN 読んでもよく分からなかった……。
JavaScript:with 構文によるブロックスコープ再考: Architect Note
かなり古いけど一応概要は分かった。分かったけど、with の引数がやべえことになってて、こりゃ悪用されそうだ……という気持ちになった。
知らないことがたくさんあるなあ。