JS Is Weird
だいたい最初のバージョンが10日くらいで作られたのに
下位互換性を保ってるのが原因
こわ

typeof null = "object"

初期のバグがそのまま仕様になっちゃってる
Object.prototype.toString.call()
あたりを使ったほうが直感に合ってるかもしれない
Lua: type(nil) == "nil"
typeofが万能じゃないせいで、型判別のやり方がややこしくなってる

typeofで判別するやつと、
===で判別するやつと、それら以外で判別するやつの3種類ある
どれかにまとめてほしい感じある
そもそも動的型言語なので、必要とするプロパティが存在するかとかで判定したほうが都合がいいとおもう

[1, 2, 3]+[4, 5, 6]
[1,2,3,4,5,6]
(Python,ruby)模範解答
普通に考えたらこうですよね
「Number, Boolean, null, undefined(, BigInt)は加算、それ以外は文字列結合」。うん、簡単だね!!() 
_class Array
functioon +(b)
return this.concat(b)
end
end
# できたらいいな
btoa("たっかー")
btoaは、文字列(Latin1 only)をBase64に変換する関数です
Latin1 onlyになった理由:レガシー実装
実行結果:エラーになります
MDNのほうが短い

mdn.jsfunction base64ToBytes(b64){const bS = atob(b64);return Uint8Array.from(bS, (m) => m.codePointAt(0));}
function bytesToBase64(bs){const bS = Array.from(bs, (bt) => String.fromCodePoint(bt),).join(""); return btoa(bS);}
// 使用方法
bytesToBase64(new TextEncoder().encode("a Ā 𐀀 文 🦄")); // "YSDEgCDwkICAIOaWhyDwn6aE"
new TextDecoder().decode(base64ToBytes("YSDEgCDwkICAIOaWhyDwn6aE")); // "a Ā 𐀀 文 🦄"
私のは任意データを変換可能にするためにごちゃごちゃやってるので、テキストしか使わないなら↑のほうがいい

undefの扱いに困る
それを言うなら空リストと空オブジェクトとnullとundefを使い分ける人がいるらしい
「あれ、いい忘れたけどundefinedはリストに入れられるよ」
静的言語なら「えっ、未定義の変数にアクセスした時undefined返したいじゃない?」はない
コンパイル時にエラーにすればいい
Javascriptも「完全な下位互換性」を捨てた新バージョンが必要な気がする

python2がpython3で大きく進化したように
それほどの互換性の捨て方ではないが
新バージョンを使う場合は
厳格モードみたいに宣言する?
#include <stdio.h>
並みのおまじないになりそう
"ES2020";
みたいなイメージ?
互換性が無いと過去のライブラリや古いWebサイト使えなくなるので、それはそれであんまり良くない

現状でもIE向けのWebサイトや古いNode.js向けのコードが最新環境で動かないとかあるので、互換性と一言で言っても古すぎる環境まで網羅しているわけではないけれど
それか別の拡張子、別のMIMEタイプにするとか

もしくはESLintを使うという手もある
設定だるいけど
一応、やばい機能には代替が開発されている印象

今やってるやつだとTemporal(Dateの代替)とか
日付の内部表現はUTCのUnixtimeだけでいいのでは?

シリアライズしやすいし
代替でどうにかなるのでそこまで問題視されていない印象がある

言語由来の構文(非公式の代替が作れないもの)での欠陥も以前はあったけど(
for...in,
var等)、それらは公式で代替が出てるし
varはしっかりとlintすればどうにかなったし、for...inは使わなきゃいい話(C言語のforと同等にもかける)だし
