UdacityのES6 - JavaScript Improvedコースを、受講しながらメモしていきます。
Lesson3 Built-ins
##Symbols
新しく追加されたデータ型。
主に、オブジェクトのプロパティを特定するために使われる。
symbolを作るには、Symbol()
を使用する。引数には文字列が入る。
const bowl = {
'apple': { color: 'red', weight: 136 },
'banana': { color: 'yellow', weight: 183 },
'orange': { color: 'orange', weight: 170 },
'banana': { color: 'yellow', weight: 176 } // 前に書いたbananaが上書きされる
};
この書き方だと、bananaというプロパティ名が重複するため、上書きされてしまう。
そこで…
const bowl = {
[Symbol('apple')]: { color: 'red', weight: 136 },
[Symbol('banana')]: { color: 'yellow', weight: 183},
[Symbol('orange')]: { color: 'orange', weight: 170 },
[Symbol('banana')]: { color: 'yellow', weight: 176 } // 上書きされない!
};
Symbol()
を使うことで、プロパティ名の重複を許容することができる。
使いどころとしては、新しくメソッドなどを追加するとき。既存ライブラリとケンカせずに追加できる。
##Set①
Set
は、値の重複がないオブジェクト、のことを指す。
配列とは異なり、インデックスによるアクセスができないという点に注意。
const sample1 = [1, 1, 2, 3]; // 値の重複があるため、セットといえない
const sample2 = [1, 2, 3, 4]; // 値の重複がないため、セットといえる
sample2はセットといえるがただの配列にすぎず、sample2.push(2)
とすれば、2が重複する。
そこで、セットを作り出すnew Set()
が追加された。
const foo = new Set(); // 空のセットを作成
console.log(foo);
// Set{}
const games = new Set(['Pokemon', 'Mario', 'Zelda', 'Pokemon']); // 値を入力して初期化も可能
console.log(games);
// Set(3) {"Pokemon", "Mario", "Zelda"}
gamesには'Pokemon'を重複して入力しているが、Setは重複を許さないため、自動的に削除される。
Setの追加・削除にはそれぞれ、add()
、delete()
メソッドが使える。
全ての要素を一括削除するにはclear()
メソッドが使える。
先ほど作成したgames変数を使って…
games.add('Kirby');
games.add('Donkey Kong');
games.delete('Mario');
console.log(games);
// Set(4) {"Pokemon", "Zelda", "Kirby", "Donkey Kong"}
games.clear(); //一括削除
console.log(games);
// Set(0) {}
セットの長さ(配列のlengthに相当)は、set.size
のようにsizeプロパティで取得できる。
##Set②
values()
メソッドは、イテレータオブジェクトを返す。
イテレータオブジェクトはnext()
を使用して、格納された値を順番に取得できる。
const months = new Set(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']);
const iterator = months.values(); // 変数iteratorにイテレータオブジェクトを代入
console.log(iterator.next()); // {value: "January", done: false}
console.log(iterator.next()); // {value: "February", done: false}
console.log(iterator.next()); // {value: "March", done: false}
done
プロパティは、セットの最後に到達したかどうか、を表している。
つまり、trueになったら、セットの最後に到達したということ。
for...of
ループを使えば、より簡単にアクセスできる。