JavaScript本格入門(ISBN 978-4774184111)で基礎からJavaScriptを勉強するシリーズです。今回はChapter3からSymbolオブジェクトについてです。
Symbolオブジェクト
symbol型はES2015から標準化されたデータ型です。
宣言
宣言は下記のように行います。
データ型はsymbolとなります。
let sym = Symbol('説明');
console.log(typeof sym); // 出力:symbol
特徴
インスタンス化するときに渡す引数はあくまでも説明
です。
同じ説明を入力したとしてもSymbolオブジェクトは別のものとみなされます。
因みに説明は省略可能です。
let sym1 = Symbol('Hello symbol');
let sym2 = Symbol('Hello symbol');
console.log(sym1 === sym2); // 出力:false
使い道
じゃんけんプログラムを作るとして、3種類の決まり手を定義する必要があります。
下記のような実装の仕方が思い浮かびます。
const ROCK = 0;
const SCISSOR = 1;
const PAPER = 2;
let userInput = PAPER;
if(userInput === ROCK) {
console.log('you choose rock.');
} else if (userInput === SCISSOR) {
console.log('you choose scissor.');
} else {
console.log('you choose paper.');
}
この方法でも識別はできますが、しかしながらROCK, SCISSOR, PAPERの数値自体には何の意味もありません。
やりたいことは3種類の概念を識別したいだけです。
ここでsymbolの特徴がうまく使えます。
const ROCK = Symbol();
const SCISSOR = Symbol();
const PAPER = Symbol();
let userInput = PAPER;
if(userInput === ROCK) {
console.log('you choose rock.');
} else if (userInput === SCISSOR) {
console.log('you choose scissor.');
} else {
console.log('you choose paper.');
}
このような場合、symbolを使ったほうがバグを未然に防げそうです。
Symbolを使わない実装では、別の人が const MONDAY = 0
を追加した場合に、ROCK === MONDAY
が等しい概念となってしまい困ったことになりますが、Symbolの場合はそれが発生しません。