たのしいJavaScriptの仕様

最近久しぶりにReact.jsを書いているんですが、細かい javascript の文法とかを忘れてしまって、↓の本を読んでいる。

最近のjavascriptは色々と良く

Rediscovering JavaScript: Master ES6, ES7, and ES8

Rediscovering JavaScript: Master ES6, ES7, and ES8

なったので良いところとその使い方を詳しく紹介する、という趣旨の本だと思うが、最初の1/4くらいでは、前提として昔のjsのどこがだめだったかというのが述べられている。プログラミング言語のだめな仕様、最初はいい加減にしろと思って終わるのだが、詳しくなってくるとだめな仕様に詳しくなるとき専用の気持ちよさみたいなものがある気がする。

かなり昔、たしか↓の本

JavaScript 第6版

JavaScript 第6版

javascriptを勉強した時に知ったBooleanのラッパー型の悲しい仕様。

const FALSE = new Boolean(false)
console.log(new Boolean(FALSE)) // [Boolean: true]

↑のような状況に実際になることはまずないとは思うが、悲しすぎる...。

次にこの本にも載っていたvarの話。最近jsを勉強している人ならvarは使わない方が良いというのは常識になっていると思うが、varの何がだめかというと、以下の2点にまとめられるらしい。

  • 変数の再宣言が許されている
  • ブロックスコープではなく関数スコープ+hoistingという仕様のため、varで変数宣言した変数のスコープがやっかいになる

スコープの話はめんどくさいので置いておくとして、変数の再宣言の話は以下のようなコードが許されるということである。

var a = 1
var a = 2 // エラーにならない!

人類は以下の2通りに分類できる

  1. ↑のコードの2行目で、1行目とは違う変数に2を代入したかった人
  2. ↑のコードの2行目で、1行目と同じ変数に2を代入したかった人

1の人は、例えばvar aa = 1と書きたかったはずなので、↑のコードは絶対にエラーになってほしいはずである。2の人は、a = 2と書きたかったはずなので、↑のコードはエラーになってくれた方がありがたいはずである。つまり、全人類が↑のコードの2行目でエラーが出てほしいと願っているのにエラーが出ないということになる。全人類...。

このvarの仕様は、最近のjsではconstletによって解決されているし、昔のjsの他のだめな点も色々と改善されている。jsは最低でもあと5年くらいは重要なプログラミング言語であり続けると思うので、詳しくなっておきたい。