現代的JavaScriptおれおれアドベントカレンダー2017 – 07日目
概要
オブジェクト定義時に、プロパティ名に変数を使えるようになりました。
今までこう↓分けて書かなくちゃいけなかったのを、
const id = '12345';
const obj = {};
obj[id] = { name: 'Newcomer!' },
console.log(obj[id]);
こう↓書けます。
const id = '12345';
const obj = {
[id]: { name: 'Newcomer!' },
};
console.log(obj[id]);
プロパティ名
この動的なプロパティ名、名前を “computed property name” といいます。「計算されるプロパティ名」。
オブジェクト初期化の際に使える「名前」は、以下の四種類ということになります。
- 識別子名
{ foo: xxx } - 文字列リテラル
{ "foo": xxx } - 数字
{ 123: xxx } - computed property name
{ [Date.now()]: xxx }
鉤括弧 [ ~ ] の中身
は基本的に何でも書けます。
ただし、計算結果を文字列に変換されます。例えば以下はどれも 10になります。
const obj0 = {
10: {},
};
const obj1 = {
[11 + 2 - 3]: {},
};
const obj2 = {
['1' + '0']: {},
};
// 10を返す関数を即時実行
const obj3 = {
[function(){ return 5 * 2; }()]: {},
};
// 文字列にすると"10"になるオブジェクト
const objOf10 = { toString: () => 10 };
const obj4 = {
[objOf10]: {},
};
テンプレート記法
文字列リテラルは使えるけどテンプレート記法は使えません。まあそうだよね。
使いたい場合は、今回のcomputed property nameと組み合わせます。
const obj = {
[`id-${id}`]: { },
};
その他
計算されるプロパティ名?
なんかもっと良い表現ないものか。
参考
- ECMAScript 2015 Language Specification – ECMA-262 6th Edition
- 12.2.6 Object Initializer … ComputedPropertyName
- 7.1.14 ToPropertyKey ( argument ) … 鉤括弧の中身を実際のプロパティ名へ変換する処理
- オブジェクト初期化子 – JavaScript | MDN