U symbolů JavaScriptu nemůžete nastavit nové vlastnosti

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 .