Symboly jsou tyto relativně nové typy, které byly přidány do jazyka nedávno. Musím ale říct, že je moc často nepoužívám. Pojďme si to rychle zrekapitulovat pomocí nabídky MDN:
A takto fungují (bezostyšně zkopírované z MDN):
const symbol1 = Symbol();
const symbol2 = Symbol(42);
console.log(typeof symbol1);
// expected output: "symbol"
console.log(symbol3.toString());
// expected output: "Symbol(foo)"
Vypadat jako „normální“ objekty v JavaScriptu, že? V JavaScriptu je stejně všechno objekt, ale dnes jsem objevil něco zvláštního. Co se stane, když chci nastavit novou vlastnost na symbol? (pokud je to dobré, je další otázka)
const a = Symbol();
a.foo = 'bar';
console.log(a.foo); // ?
Úryvek výše zaznamenává undefined
do konzole. To ukazuje, že u symbolu není možné nastavit nové vlastnosti. Runtime však nehlásí chybu.
Důvodem tohoto chování je, že symboly jsou v JavaScriptu primitivní a primitiva jsou neměnná . To znamená, že stejná funkce platí pro typy Boolean
, Null
, Undefined
, Number
a String
.
const a = 123;
a.foo = 'bar';
console.log(a.foo); // undefined
const b = 'baz';
b.length = 2;
console.log(b.length); // 3
Je zřejmé, že není mnoho případů použití pro nastavení nové nebo předefinování vlastnosti na např. Number
(jestli vůbec nějaké existují), ale nevěděl jsem, že primitiva jsou obecně neměnná a to je pěkný a drsný detail JavaScriptu.
Upraveno:Jako uživatel redditu pertheusual
poukazuje na to, že přidání vlastností do primitiv vyvolá výjimku v strict mode
.