السجلات و tuples هي أنواع بيانات JavaScript غير قابلة للتغيير في الوقت الحالي المرحلة 2 في عملية الموافقة على معايير TC39. وهي عرضة للتغيير وغير متوفرة حاليًا في أي متصفح أو وقت تشغيل ، ولكن يجب أن تصل تطبيقات العمل خلال العام المقبل. إنهم يساعدون في حل بعض الألغاز المربكة التي يواجهها المبرمجون …

التغييرات المستمرة

سيخبرك محترفو جافا سكريبت المحترفون أن تعيين المتغيرات باستخدام const هو أفضل ممارسة حيثما أمكن ذلك. يجعل المتغيرات غير قابل للتغيير. لا يمكن تغيير القيم ، لذلك لديك مشكلات أقل للتعامل معها.

لسوء الحظ، const فقط يجعل القيم الأولية غير قابلة للتغيير (String و Number و BigInt و Boolean و Symbol و undefined). لا يمكنك إعادة تعيين مصفوفة أو كائن ، ولكن القيم والخصائص التي تحتوي عليها يستطيع يمكن تعديلها. فمثلا:


const myArray = [1, 2, 3];


myArray[0] = 99;
myArray.push(42);

console.log(myArray); 

myArray = 'change'; 

وبالمثل بالنسبة للكائنات:


const myObj = { a: 1, b: 2, c: 3 }


myObj.a = 99;
myObj.d = 42;

console.log(myObj); 

myObj = 'change'; 

ال Object.freeze() يمكن أن تساعد الطريقة ، ولكن يتم تطبيق التجميد السطحي فقط على الخصائص الفرعية المباشرة للكائن:

const myObj = { a: 1, b: 2, c: { v: 3 } }
Object.freeze(myObj);

myObj.a = 99; 
myObj.c.v = 99; 

console.log(myObj); 

لذلك من الصعب ضمان أن الدالة لن تغير القيم الموجودة في مصفوفة أو كائن عن قصد أو عرضاً. يجب أن يأمل المطورون في الأفضل أو يجتازون نسخة مستنسخة من المتغير – (التي لها تحدياتها الخاصة).

عدم المساواة المكافئة

يمكن أن تحدث المزيد من الفوضى عندما يحاول المطورون إجراء مقارنات معقولة بين العناصر أو المصفوفات:

const str = 'my string';
console.log( str === 'mystring' );  

const num = 123;
console.log( num === 123 );         

const arr = [1, 2, 3];
console.log( arr === [1, 2, 3] );   

const obj = { a: 1 };
console.log( obj === { a: 1 } );    

فقط الأنواع البدائية يمكن مقارنتها بالقيمة. يتم تمرير الكائنات والمصفوفات ومقارنتها بالتزكية. سيكون متغيرين متكافئين فقط عندما يشيران إلى نفس العنصر في الذاكرة:

const a = [1, 2];

const b = a;
b.push(3);

console.log( a === b ); 


console.log( a ); 

تتطلب المقارنة العميقة بين كائنين أو مصفوفتين وظيفة مقارنة متكررة لتقييم كل قيمة بدورها. حتى مع ذلك ، قد تواجه مشكلات مع أنواع مثل التواريخ أو الوظائف التي يمكن تخزينها بطرق مختلفة.

المجموعات: هياكل بيانات تشبه المصفوفة الثابتة

Tuples هي هياكل بيانات تشبه الصفيف غير قابلة للتغيير بشدة. إنها أنواع بدائية مركبة بشكل فعال محددة بـ # المعدل أمام بناء جملة الصفيف العادي:


const t1 = #[1, 2, 3];
const t2 = #[1, 2, #[3, 4]];

بدلا من ذلك ، جديد Tuple.from() يمكن أن يُنشئ التابع tuple من مصفوفة:


const t3 = Tuple.from( [1, 2, 3] );

على عكس المصفوفات القياسية ، يجب أن تفي المجموعات بهذه المتطلبات:

  1. لا يجب أن يكون لديهم الثقوب بقيم غير محددة. فمثلا، #[1,,,4] غير صالح.
  2. يجب عليهم فقط تعيين العناصر الأولية أو المجموعات أو السجلات الأخرى. لا يُسمح بأنواع مثل المصفوفات أو الكائنات أو الوظائف:
  const t4 = #[ new Date() ]; 
  const t5 = #[1, 2, [3, 4]]; 

نظرًا لأن tuple هي عناصر أولية ، فيمكن مقارنتها بعمق من حيث القيمة مع المجموعات الأخرى:

const t6 = #[1, 2];

console.log( t6 === #[1, 2] ); 

لاحظ أن المقارنات باستخدام الأقل صرامة == عامل التشغيل ممكن إذا كانت المجموعة تحتوي على قيمة واحدة. فمثلا:

const t7 = #[99];

console.log( t7 == #[99] ); 
console.log( t7 == 99 );    
console.log( t7 == '99' );  


console.log( t7 == [99] );  

السجلات: هياكل بيانات شبيهة بالكائنات غير قابلة للتغيير

السجلات هي هياكل بيانات شبيهة بالكائنات غير قابلة للتغيير. مرة أخرى ، فهي أنواع بدائية مركبة محددة بـ # معدل أمام بناء جملة الكائن العادي:


const r1 = #{ a: 1, b: 2 };
const r2 = #{
  a: 1,
  b: #{ c: 2 }, 
  d: #[ 3, 4 ]  
};

بدلا من ذلك ، الجديد Record() يمكن للمُنشئ إنشاء سجل من كائن:



const r3 = Record({ a: 1, b: 2 });

أو ال Record.fromEntries() يمكن للطريقة إنشاء سجل من سلسلة من أزواج الصفيف أو مجموعة القيم:



const r4 = Record.fromEntries([
  ['a', 1],
  ['b', 2]
]);

على عكس الكائنات القياسية ، يجب أن تفي السجلات بالمتطلبات التالية:

  1. يجب أن يستخدموا أسماء خصائص السلسلة. فمثلا، #{ Symbol(): 1 } غير صالح.
  2. يجب عليهم فقط تعيين القيم باستخدام العناصر الأولية أو المجموعات الأخرى أو السجلات. لا يُسمح بأنواع مثل المصفوفات أو الكائنات أو الوظائف:
  const r5 = #{ 'd': new Date() };   
  const r6 = #{ a: 1, b: { c: 2 } }; 

يمكن مقارنة السجلات بعمق مع السجلات الأخرى ولا يهم ترتيب الملكية:

const r7 = #{ a: 1, b: 2 };

console.log( r7 === #{ b: 2, a: 1 } ); 

لا يمكن مقارنة السجلات إلا بالسجلات الأخرى ، لذا فإن استخدام ملف == أو === المشغل لا فرق. ومع ذلك ، من الممكن استخراج الكائن keys() و values() لمقارنات محددة. فمثلا:

const r8 = #{ a: 99 };

console.log( Object.values(r8) == 99 ); 

تحديثات غير قابلة للتغيير

قد تبدو المجموعات والسجلات مثل مصطلحات علوم الكمبيوتر المعقدة ، لكنها ستسمح أخيرًا بتخزين البيانات والمقارنات القوية غير القابلة للتغيير في JavaScript. يمكنك تجربتها اليوم في هذا الملعب، أو مع هذا البوليفيل، ولكن يرجى العلم أن التنفيذ المقترح يمكن أن يتغير في الأشهر المقبلة.

المصدر

المادة السابقةالفرق بين Chromebook واللاب توب
المقالة القادمةالفرق بين Samsung Galaxy S7 و Galaxy S7 Edge

ترك الرد

من فضلك ادخل تعليقك
من فضلك ادخل اسمك هنا