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 の引数がやべえことになってて、こりゃ悪用されそうだ……という気持ちになった。
知らないことがたくさんあるなあ。