ES6でコードを書いていると、const
を多用していくケースもありますが、どうにもモヤッとした気分になってしまいます。原因を考えてみると、「言語・文脈ごとにconst
の意味合いが違ってくるから」という結論に達しました。
C++
C++にあるconst
キーワードは、状況によってconst
となる対象が変わってきます。そして、クラス型について、普通の変数や参照では「オブジェクトと変数を切り離せない」ということもあってか、オブジェクトそのものを書き換え禁止できるという、特徴的な機能があります。
-
const SomeObject o
…o
自体が書き換え不能(const
でなくても、o
とオブジェクトを切り離す方法もない) -
const SomeObject& r
…r
自体が書き換え不能(const
でなくても、r
とオブジェクトを切り離す方法もない) -
const SomeObject * p
…p
の指す先が書き換え不能 -
SomeObject * const p
…p
自体が書き換え不能
PHP
PHPの場合、const
をかけた定数にできることがかなり限られています。
- スカラー型、あるいは配列(PHP 5.6以上)のみ定数にできる。オブジェクトを定数にはできない。
-
const
で定数を作る場合、書けるものはリテラルか定数式(PHP 5.6以上)のみ。 -
define
関数を使えば、式の結果を定数にできる。
ES6
これらに対してES6では、const
にかかる制約は「入れたもの(値 or オブジェクト)を入れ替えられない」だけです。破壊的変更だろうが可能ですし、計算した結果をconst
変数に格納しようが一向に構いません。
似たような機能が何かにあったなと考えてみたら、Javaのfinal
でした。