現代的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