في JavaScript ، تعتبر الرموز أنواع بيانات فريدة يمكن استخدامها لإنشاء معرفات لخصائص الكائن. الرموز ليست مثل السلاسل أو الأرقام ، ولا يمكن تحويلها إلى أنواع البيانات هذه. هذا ما يجعلها مثالية لإنشاء المعرفات.
استخدام الرموز في جافا سكريبت
عند إنشاء رمز ، يمكنك اختياريًا إعطائه وصفًا. هذا مفيد لتصحيح الأخطاء ، لكنه غير مطلوب.
إنشاء رمز بسيط.
const mySymbol = Symbol();
يمكنك أيضًا إنشاء رمز مع وصف.
const mySymbol = Symbol("my description");
إذا قمت بإنشاء رموز متعددة بنفس الوصف ، فستكون قيمًا مختلفة.
const sym1 = Symbol("foo");
const sym2 = Symbol("foo");
// false
console.log(sym1 === sym2);
ما الذي يجعل الرموز فريدة
غالبًا ما تستخدم الرموز كمعرفات لخصائص الكائن. وذلك لأن الرموز مضمونة لتكون فريدة ولا يتم تحويلها إلى سلاسل.
const obj = {};
obj[mySymbol] = "bar";
// "bar"
console.log(obj[mySymbol]);
يمكنك استخدام الرموز كمفاتيح لخصائص الكائن ، لكن لا يمكنك استخدامها كأسماء خصائص (مفاتيح) في JSON.
const sym = Symbol("foo");
const obj = { [sym]: "bar" };
// {}
console.log(JSON.stringify(obj));
الرموز غير قابلة للعد ، لذلك لن تظهر عند استخدام حلقة for-in على كائن.
const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";
for (var key in obj) {
// undefined
console.log(key);
}
يمكنك استخدام Object.getOwnPropertySymbols للحصول على مصفوفة من جميع الرموز على كائن.
const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";
const symbols = Object.getOwnPropertySymbols(obj);
// [Symbol(a), Symbol(b)]
console.log(symbols);
استخدام رمز كمكرر
يمكنك استخدام Symbol.iterator المشهور للحصول على رمز يمكن استخدامه كمكرر.
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());
مثال أكثر واقعية
يمكنك إنشاء الرموز الخاصة بك ، ولكن لا توجد طريقة لضمان أنها فريدة من نوعها. إذا كنت بحاجة إلى رمز فريد ، فيجب عليك استخدام الرمز ().
افترض أن لديك شيئًا يمثل شخصًا. تريد إضافة خاصية إلى هذا الكائن الذي يخزن سنة ميلاد الشخص ، لكنك لا تريد أن تكون هذه الخاصية قابلة للعد. يمكنك القيام بذلك برمز:
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]);