技術とかの雑なToday I Learnedメモ

NaN === NaNはどうなる?の記事

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構文、初めて知りました。

with - JavaScript | MDN

MDN 読んでもよく分からなかった……。

JavaScript:with 構文によるブロックスコープ再考: Architect Note

かなり古いけど一応概要は分かった。分かったけど、with の引数がやべえことになってて、こりゃ悪用されそうだ……という気持ちになった。

知らないことがたくさんあるなあ。