Javascript'teki Sembol

Sembolleri Tanıyın: Nesne Özellikleri için Benzersiz Veri Türü

JavaScript'te semboller, nesne özellikleri için tanımlayıcılar oluşturmak için kullanılabilen benzersiz veri türleridir. Semboller, dizeler veya sayılar gibi değildir ve bu veri türlerine dönüştürülemezler. Bu onları tanımlayıcılar oluşturmak için ideal yapan şeydir.

Javascript'te Sembollerin Kullanımı

Bir sembol oluşturduğunuzda, isteğe bağlı olarak ona bir açıklama verebilirsiniz. Bu, hata ayıklama için kullanışlıdır, ancak gerekli değildir.

Bir sembol oluşturmak basittir.

const mySymbol = Symbol();

Ayrıca açıklama içeren bir sembol de oluşturabilirsiniz.

const mySymbol = Symbol("my description");

Aynı açıklamaya sahip birden fazla sembol oluşturursanız, bunlar farklı değerler olacaktır.

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

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

Sembolleri benzersiz yapan nedir

Semboller genellikle nesne özellikleri için tanımlayıcılar olarak kullanılır. Bunun nedeni, sembollerin benzersiz olmalarının garanti edilmesi ve dizelere dönüştürülmemeleridir.

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

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

Sembolleri nesne özellikleri için anahtar olarak kullanabilirsiniz, ancak bunları JSON'da özellik adları (anahtarlar) olarak kullanamazsınız.

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

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

Semboller numaralandırılamaz, bu nedenle bir nesne üzerinde for-in döngüsü kullandığınızda görünmezler.

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

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

Bir nesnedeki tüm sembollerin bir dizisini almak için Object.getOwnPropertySymbols'u kullanabilirsiniz.

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

const symbols = Object.getOwnPropertySymbols(obj);

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

Yineleyici olarak bir Sembol kullanma

Yineleyici olarak kullanılabilecek bir sembol elde etmek için iyi bilinen Symbol.iterator'ı kullanabilirsiniz.

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());

Daha gerçek dünyadan bir örnek

Kendi sembollerinizi oluşturabilirsiniz, ancak bunların benzersiz olduklarını garanti etmenin bir yolu yoktur. Benzersiz bir sembole ihtiyacınız varsa, Symbol() kullanmalısınız.

Bir kişiyi temsil eden bir nesneniz olduğunu varsayalım. Bu nesneye kişinin doğum yılını saklayan bir özellik eklemek istiyorsunuz, ancak bu özelliğin numaralandırılabilir olmasını istemiyorsunuz. Bunu bir sembolle yapabilirsiniz:

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]);