JavaScript のリテラルパターン

オブジェクトリテラル

オブジェクトの作成はコンストラクタにて以下のように書けます。

var car = new Object();
car.goes = "far";

が、より簡素なオブジェクトリテラル表記を使うべきです。

var car = {goes: "far"};


オブジェクトコンストラクタに数値を渡した場合、以下のように実際に作成されるオブジェクトが異なります。

var o1 = new Object(2);
console.log(o1.constructor === Number); // true

var o2 = new Object("hello");
console.log(o2.constructor === String); // true

var o3 = new Object(true);
console.log(o3.constructor === Boolean); // true

これは、実行時に引数が動的に変わる場合にトラブルの元になります。
オブジェクトの作成にはオブジェクトリテラル表記を使うべきです。


配列リテラル

配列はコンストラクタにて以下のように書けます。

var a = new Array("one", "two", "three");

より簡素な配列リテラルを使うべきです。

var a = ["one", "two", "three"];


これは、コンストラクタを使って要素が1つの配列を得ようとした場合

var a = new Array(3);

のようにすると、実際には要素が3つの配列が作成されます。これは望む動作ではありません。

var a = [3];

とすると、要素が1つで値が3の配列が得られます。
配列の作成には配列リテラルを使うべきです。


正規表現リテラル

正規表現オブジェクトは new を使っても、関数とみなして new を使わなくても同じ振る舞いになります。

var re1 = new RegExp("[a-z]", "g");
var re2 = RegExp("[a-z]", "g");


しかし、より簡素なのは、正規表現リテラルを使って以下のように定義することです。

var re = /[a-z]/g;

プリミティブラッパー

プリミティブのラッパーオブジェクトには String、Number、Boolean があり、コンストラクタにて以下のようにオブジェクトを作成できます。

var s = new String("hello");
var n = new Number(100);
var b = new Boolean();

オブジェクトラッパーには String.toUpperCase() といったメソッドがあり、便利に利用できます。しかし以下のようにプリミティブで定義した場合でも、プリミティブは一時的にオブジェクトに変換されオブジェクトとして振る舞わせることができます。

var s = "hello";
s.toUpperCase();


あえて冗長なラッパーコンストラクタを使う必要はなく、簡素なリテラル表現を使うべきです。

var s = "hello";
var n = 100;
var b = false;

エラーオブジェクト

Error オブジェクトには、name と message プロパティがります。name プロパティの値は、一般的には"Error"です。そしてエラーコンストラクタは、new なしで関数として呼び出しても、new を使ってコンストラクタとして呼び出しても振る舞いは同じです。

throw new Error("oops");

と書くのであれば、より簡素な

throw Error("oops");

が望ましいです。


また、throw は任意のオブジェクトを指定できるので、以下のように独自のオブジェクトを投げることもできます。

throw {
  name: "Error",
  message: "oops"
};

追加のプロパティなどが必要な場合には、この書き方が望ましいです。






JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス