La Simbolo en Javascript

Konu Simbolojn: La Unika Datumtipo por Objektaj Propraĵoj

En JavaScript, simboloj estas unikaj datumtipoj kiuj povas esti uzitaj por krei identigilojn por objektotrajtoj. Simboloj ne estas kiel ŝnuroj aŭ nombroj, kaj ili ne povas esti konvertitaj al tiuj datumtipoj. Jen kio igas ilin idealaj por krei identigilojn.

Uzado de Simboloj en Javascript

Kiam vi kreas simbolon, vi povas laŭvole doni al ĝi priskribon. Ĉi tio utilas por sencimigi, sed ĝi ne estas postulata.

Krei simbolon estas simpla.

const mySymbol = Symbol();

Vi ankaŭ povas krei simbolon kun priskribo.

const mySymbol = Symbol("my description");

Se vi kreas plurajn simbolojn kun la sama priskribo, ili estos malsamaj valoroj.

const sym1 = Symbol("foo");
const sym2 = Symbol("foo");

// false
console.log(sym1 === sym2);

Kio igas Simbolojn unikaj

Simboloj ofte estas uzataj kiel identigiloj por objektotrajtoj. Ĉi tio estas ĉar simboloj estas garantiitaj esti unikaj, kaj ili ne estas konvertitaj al ŝnuroj.

const obj = {};
obj[mySymbol] = "bar";

// "bar"
console.log(obj[mySymbol]);

Vi povas uzi simbolojn kiel ŝlosilojn por objektaj propraĵoj, sed vi ne povas uzi ilin kiel posedaĵnomojn (ŝlosilojn) en JSON.

const sym = Symbol("foo");
const obj = { [sym]: "bar" };

// {}
console.log(JSON.stringify(obj));

Simboloj ne estas kalkuleblaj, do ili ne aperos kiam vi uzas for-en-buklon sur objekto.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

for (var key in obj) {
  // undefined
  console.log(key);
}

Vi povas uzi Object.getOwnPropertySymbols por akiri tabelon de ĉiuj simboloj sur objekto.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

const symbols = Object.getOwnPropertySymbols(obj);

// [Symbol(a), Symbol(b)]
console.log(symbols);

Uzante Simbolon kiel ripetanton

Vi povas uzi la konatan Symbol.iterator por akiri simbolon, kiu povas esti uzata kiel iteratoro.

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();

// { value: 1, done: false }
console.log(it.next());

// { value: 2, done: false }
console.log(it.next());

// { value: 3, done: false }
console.log(it.next()); 

// { value: undefined, done: true }
console.log(it.next());

Pli reala ekzemplo

Vi povas krei viajn proprajn simbolojn, sed ne ekzistas maniero garantii, ke ili estas unikaj. Se vi bezonas unikan simbolon, vi devus uzi Symbol().

Supozu, ke vi havas objekton, kiu reprezentas homon. Vi volas aldoni posedaĵon al ĉi tiu objekto, kiu konservas la naskiĝjaron de la persono, sed vi ne volas, ke ĉi tiu posedaĵo estu nombrebla. Vi povas fari tion per simbolo:

const person = {
  name: "John Doe"
};
const birthYear = Symbol("birth year");
person[birthYear] = "1955";

for (var key in person) {
  // name
  console.log(key); 
}

// 1955
console.log(person[birthYear]);