JavaScript - プリミティブとラッパーオブジェクト
新しい言語を学ぶとき、ざっと概要を読んで、今まで学んだ言語との違いにフォーカスすれば覚えやすいのではないか?と考えみた。
普通なら、ひとつひとつ試しながらJavascriptの構文とか、クセとかを覚えるべきなのかもしれないが、これまでに通ってきたのと同じ道を何度も何度も通るのは苦痛になりかねない。
すでにコードを書く基礎的なことはできているため、多分こんな感じでサマリを掴んで、あとはデモを作ったり、実践でクセを覚えるのが良いのではないだろうか。
さて、本日はこのように方針転換して勉強してみる。
プリミティブとオブジェクトが混在しているのが気になっていたが、もう少し広い視点で捉えてみたらなんとかなりそうな気がしてきた。
例えば、Pythonならダブルクォーテーションで囲ったものは文字列であり、文字列クラスのインスタンスである。
しかし、JavaScriptではダブルクォーテーションで囲った文字列は"プリミティブな"文字列であり、new String
で生成する文字列クラスのインスタンスではないらしい。
ただし、プリミティブな文字列は"必要に応じてStringのインスタンスに変換される"ので、動作として理解しづらい。つっか最高に気持ち悪い。
本来、JSでのプリミティブなリテラルはメソッドを持たないゆえにプリミティブであるといえるようだが、文字列なんかは必要に応じてラップされる。だからStringのメソッドが使えたりする。
・・・なんじゃそりゃ、な仕様なんだが、ここは言葉を整理して紐解けばなんとかなりそう。
Let's プログラミングさんから引用すると、次のように分けられるらしい。
<プリミティブなもの>
- 数値
- 長整数 ※ ES2020~
- 文字列
- 論理値
- undefined
- null
- シンボル
<オブジェクト型のもの>
ここで注目すべきは、StringやNumberはラッパーオブジェクトとして扱われることだ。
つまり、プリミティブな文字列、数値に対して、StringやNumberのメソッドを呼び出そうとすると自動的に変換されるというやつだ。
一部だけが勝手に変わると理解するのではなく、ラッパーがあるものはラッパーオブジェクトに変換される、と考えれば動きが理解しやすいと思った。