Quora Userさんのプロフィール写真

仮に、無限ループを実行するためだけの専用のループ構文loop{}文と、while(true){}の両方が無限ループを実行するために使用可能だったとします。このとき、無限ループを書くときにはloop文を使うべきだと考えます。

このときに適用される原則は、目的達成のために、汎用機能の一部を流用するのではなく、より固有性がたかい方、機能が小さい方を選択するということです。

さらに大原則を言えば、プログラムコードはプログラマの意図を表現するためのものです。選択可能な表現の選択肢のうち、よりピンポイントな、狭い表現のほうが、より解像度高く、精密に意図を示せるのでそれを選択するということです。

それを前提にしてですが、まずドット表記は、以下の機能をもちます

  • プロパティ名は、.の後に指定してあたえる。構文制約上、JavaScriptの識別子として有効であるstring型のリテラルに限定される。
  • その文字列の値をキーとしてもつエントリの値を返す。

これに対して、括弧(ブラケット)でのアクセスは以下の機能をもちます。

  • プロパティ名は括弧内に指定した任意の式の評価結果から求める
  • 括弧内の評価結果がSymbol型であるときはそのSymbol値をキーとして探索、string型であるときはその文字列で探索、Symbol型、string型以外であればtoString()を呼び出してその結果のstringをキーとして探索し、エントリの値を返す

これでわかるように、ブラケット記法のほうが機能が大きく、汎用的で、ドット表記の機能性をすべて具備します。逆は成り立ちません。

以上を踏まえてご質問に答えますと、プロパティ名が「識別子として有効な文字列のリテラル」ならば、より機能が小さいドット表記で目的を達成できるのでそれを選択します。それ以外の場合はブラケットを使います。

まあ、本当はある意味どっちでもいいのですが、上のような原則を決めておけば、迷うことはありません。迷わないこと、表現が一意に定まることは重要です。

この質問に対する他の1件の回答を表示