المجموعات المفهرَسة

المجموعة المفهرسة هي عبارة عن هيكل بيانات يتم فيه تخزين العناصر يتم الوصول إليها باستخدام فهارس مرقمة. القيم المخزَّنة في مجموعة مفهرَسة هي فهارس مرقّمة مخصصة بدءًا من 0، وهو نمط يسمى "الفهرسة الصفرية". ويمكنك بعد ذلك الوصول إلى القيم المخزنة في أي مجموعة مُفهرَسة من خلال الرجوع إلى فهارسها.

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

إنشاء صفيف

كما هو الحال مع أنواع البيانات الأولية، هناك طريقتان لإنشاء صفيف: قيمة حرفية للمصفوفة أو من خلال استدعاء الدالة الإنشائية Array() المضمَّنة في JavaScript مع new Array(). يؤدي تعيين صفيف إلى متغير إلى توفير قابلية أكبر لقابلية النقل وقابلة للقياس لتحديد قيم متعددة في معرّف واحد.

تستخدم البنية الحرفية للمصفوفة مجموعة من الأقواس ([]) المحيطة بصفر أو أكثر قيم البيانات المفصولة بفواصل:

const myArray = [];

تستخدم بنية الدالة الإنشائية للمصفوفة كائن Array المضمّن في JavaScript باعتباره دالة إنشاء مع الكلمة الرئيسية new:

const myArray = new Array();

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

const myArray = [ true, null, "String", false ];

myArray;
> [ true, null, "String", false ]

يأخذ بناء جملة الدالة الإنشائية للصفيف القيم المفصولة بفواصل كوسيطات، مع إضافة استثناء سلوك خاص:

const myArray = new Array( true, null, "String", false );

myArray;
> Array(4) [ true, null, "String", false ]

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

// Firefox:\
const myArray = new Array( 10 );

myArray;
> Array(10) [ <10 empty slots> ]
// Chrome:
const myArray = new Array( 10 );

myArray;
> (10) [empty × 10]

تعتبر الصفائف التي تحتوي على خانات فارغة (تُسمى أحيانًا "الصفائف المتفرقة") أمرًا خاصًا الحالات. بدلاً من أن تحتوي على القيمة undefined أو القيمة null بشكل صريح، يُرجى ملء هذا الحقل. وغالبًا، ولكن ليس دائمًا، يتم التعامل مع الخانات على أنّها قيم undefined في أي مكان آخر في .

يمكنك عن طريق الخطأ إنشاء صفيف متفرق باستخدام البنية الحرفية للصفيف من خلال حذف قيمة بين الفواصل عند إنشاء قيمة حرفية للصفيف:

const myArray = [ true,, true, false ];

myArray;
> Array(4) [ true, <1 empty slot>, true, false ]

رغم عدم التعامل معه كقيمة ذات معنى في جميع السياقات، إلا أن خانة فارغة إلى إجمالي طول الصفيفة، مما قد يؤدي إلى نتائج غير متوقعة عند التكرار التحسيني قيم الصفيفة:

const myArray = [ 1,, 3, 4 ];

myArray.length;
> 4

for( const myValue of myArray ) {
  console.log( myValue + 10 );
}
> 11
> NaN
> 13
> 14

وهذا السلوك متوقف عن بعض القرارات السابقة المتعلقة بالتصميم في JavaScript. تجنَّب استخدام صفائف متفرقة في التطوير الحديث.

كما هو الحال مع الأساسيات، لا شك أن الصفيفة الحرفية يكتسب الخصائص والطرق من الدالة الإنشائية المقابلة. بما أن الصفيفة عبارة عن شكل خاص من الكائنات، فإن بناء الجملة الحرفي للصفيف تنشئ بنية new Array() نتائج متطابقة وظيفيًا، وهي كائن يكتسب نموذجه الأولي من الدالة الإنشائية Array.

const arrayLiteral = [];
const arrayConstructor = new Array();

typeof arrayLiteral;
> "object"

arrayLiteral;
> Array []
    length: 0
    <prototype>: Array []

typeof arrayConstructor;
> "object"

arrayConstructor;
> Array []
    length: 0
    <prototype>: Array []

نظرًا لأن النتيجتين متطابقتان، وأن بناء الجملة الحرفي للصفيف أكثر إيجازًا وحرفيًا، فإننا ننصح بشدة دائمًا باستخدام بناء الجملة الحرفي للصفيف بدلاً من بنية new Array().

الوصول إلى قيم الصفائف

ويمكنك الوصول إلى عناصر فردية داخل الصفيفة باستخدام تدوين القوس، مجموعة من الأقواس ([]) بعد الصفيف أو معرّفها الذي يحتوي على الرقم الذي يشير إلى فهرس ذلك العنصر:


[ "My string", "My other string" ][ 1 ];
> "My other string"

const myArray = [ "My string", 50, true ];

myArray[ 0 ];
> "My string"

myArray[ 1 ];
> 50

myArray[ 2 ];
> true

الصفائف في JavaScript ليست مرتبطة، وهذا يعني أنه لا يمكنك استخدام سلسلة عشوائية كفهرس. ومع ذلك، يتم فرض القيم المستخدمة للوصول إلى العناصر في صفيفة على قيمة سلسلة خلف الكواليس، مما يعني أنه يمكنك استخدام قيمة سلسلة تحتوي فقط على الأحرف:

const myArray = [ "My string", 50, true ];

myArray[ 2 ];
> true

myArray[ "2" ];
> true

تؤدي محاولة الوصول إلى عنصر خارج العناصر المحددة في الصفيفة إلى undefined، ليس خطأ:

const myArray = [ "My string", 50, true ];

myArray[ 9 ];
> undefined

إلغاء المهمة الدراسية

تعد هيكلة التعيين طريقة موجزة لاستخراج نطاق من القيم من الصفائف أو الكائنات وتعيينها لمجموعة من محددة، وهي عملية تسمى أحيانًا "تفريغ" هيكل البيانات الأصلي، على الرغم من أنّه لا يعدّل الصفيفة أو الكائن الأصليَين.

تستخدم عملية إتلاف قائمة المعرفات على شكل صفيف أو كائن تتبع القيم. يُسمى في أبسط صوره نمط الربط إتلاف كل قيمة، يتم فك ضغط كل قيمة من الصفيفة أو الكائن وتعيينها إلى المتغيّر المتجاوب، الذي تم إعداده باستخدام let أو const (أو var):

const myArray = [ "A string", "A second string" ];
const [ myFirstElement, mySecondElement ] = myArray;

const myObject = { firstValue: false, secondValue: true };
const { myProp, mySecondProp } = myObject;

myFirstElement;
> "My string"

mySecondElement;
> "Second string"

myProp;
> false

mySecondProp;
> true

يمكنك استخدام الأقواس المعقوفة ({}) لإتلاف كائن، والأقواس المربّعة ([]) لإجراء ما يلي: إتلاف صفيفة.

const myArray = [ false, true ];
const myObject = { firstValue: false, secondValue: true };

const [ myProp, mySecondProp ] = myObject;
> Uncaught TypeError: myObject is not iterable

const { myElement, mySecondElement } = myArray;

myElement
> undefined

mySecondElement;
> undefined

يحدث إتلاف صفيف بترتيب تسلسلي، من اليسار إلى اليمين. على كل المحدد في عملية التدمير مع العنصر في صفيفة لها نفس الفهرس:

const myArray = [ 1, 2, 3 ];
const [ myElement, mySecondElement, myThirdElement ] = myArray;

myElement;
> 1

mySecondElement;
> 2

myThirdElement;
> 3

وهذا هو السلوك الافتراضي أيضًا عند إتلاف كائن. ومع ذلك، إذا كانت تتطابق المعرفات المستخدمة في عملية إتلاف المفاتيح مع مفاتيح كائن المواقع، تتم تعبئة هذه المعرّفات بالموقع المتوافق معها بغض النظر عن الترتيب الذي تم تحديدها به:

const myObject = { firstValue: 1, secondValue: 2, thirdValue 3 };
const { secondValue, thirdValue, firstValue } = myObject;

firstValue;
> 1

secondValue;
> 2

thirdValue;
> 3

ويمكن تخطّي العناصر من خلال حذف أحد المعرّفات:

const myArray = [ 1, 2, 3 ];
const [ firstValue,, secondValue ] = myArray;

firstValue;
> 1

secondValue;
> 3

يتيح لك إتلاف بناء الجملة أيضًا تعيين قيم افتراضية في حالة إلغاء هيكلة هي إما خانة فارغة، كما في حالة صفيف متناثر، أو قيمة undefined.

const myArray = [ true, ];
const [ firstValue = "Default string.", secondValue = "Default string." ] = myArray;

firstValue;
> true

secondValue;
> "Default string."

لا تفرض عملية التفكيك القيم على أنواع معينة. هذا يعني أنّ قيم "falsy"، مثل الفارغة السلاسل ("") أو null لا تزال تعتبر قيمًا مجزأة ذات معنى:

const myArray = [ false, null, 0, "",, undefined ];
const [ falseValue = true, nullValue = true, zeroValue = true, emptyStringValue = true, emptySlot = true, undefinedValue = true ] = myArray;

falseValue;
> false;

nullValue;
> null

zeroValue;
> 0

emptyStringValue;
> ""

emptySlot;
> true

undefinedValue;
> true

عامل الانتشار

استخدِم عامل الانتشار (...) الذي تم تقديمه في ES6 لتوسيع البيانات القابلة للتكرار. بنية مثل صفيفة أو سلسلة أو كائن حرفي إلى عناصر فردية. عامل الانتشار متبوعًا ببنية البيانات المراد توسيعها أو معرّف متغير يحتوي على بنية البيانات هذه.

const myArray = [ 1, 2, 3 ];

console.log( ...myArray );
> 1 2 3

يتم استخدام بناء جملة الانتشار بشكل أساسي لنسخ الصفائف ودمجها:

const myArray = [ 4, 5, 6 ];
const mySecondArray = [1, 2, 3, ...myArray ];

mySecondArray;
> Array(6) [ 1, 2, 3, 4, 5, 6 ]

يمكنك استخدام بناء جملة الانتشار في السياقات التالية فقط:

بالنسبة إلى الصفائف والسلاسل، لا يتم تطبيق بنية التوزيع إلا عندما لا يتم تطبيق وسيطات أو أكثر في استدعاء الدالة أو العناصر المتوقعة في الصفيف. المثال الأول على تعمل بنية عامل الانتشار في هذا القسم لأنها تمرر ...myArray وسيطة إلى طريقة console.log المضمنة.

على سبيل المثال، لا يمكنك تعيين البيانات المنتشرة إلى متغير خارج صفيف آخر:

const myArray = [ 1, 2, 3 ];
const spreadVariable = ...myArray;
> Uncaught SyntaxError: Unexpected token '...'

لكنك تنسخ صفيفًا عن طريق نشر الصفيفة الأصلية إلى قيمة حرفية للصفيف:

const myArray = [ 1, 2, 3 ];
const spreadArray = [ ...myArray ];

spreadArray;
> Array(3) [ 1, 2, 3 ]

لدمج العناصر التي تشكل صفيفتين أو أكثر في صفيف واحد:

const myArray = [ 1, 2, 3 ];
const mySecondArray = [ 4, 5, 6 ];
const myNewArray = [ ...myArray, ...mySecondArray ];

myNewArray;
> Array(6) [ 1, 2, 3, 4, 5, 6 ]

أو لتمرير عناصر صفيف كوسيطات فردية في استدعاء الدالة:

const myArray = [ true, false ];
const myFunction = ( myArgument, mySecondArgument ) => {
    console.log( myArgument, mySecondArgument );
};

myFunction( ...myArray );
> true false

تم توسيع مشغل الانتشار للعمل مع القيم الحرفية للكائنات في ES2018. كما هو الحال مع الصفائف، يمكنك استخدام عامل الانتشار لتكرار الكائنات أو دمجها:

const myObj = { myProperty : true };
const mySecondObj = { ...myObj };

mySecondObj;
> Object { myProperty: true }
const myFirstObj = { myProperty : true };
const mySecondObj = { additionalProperty : true };
const myMergedObj = { ...myFirstObj, ...mySecondObj };

myMergedObj;
> Object { myProperty: true, additionalProperty: true }

يقوم عامل الانتشار بإنشاء "shallow" نسخ. هذا يعني أنه لا ينسخ هو النموذج الأولي للكائن الأصلي وغير قابل للتعداد المواقع.

const myCustomPrototype = { protoProp: "My prototype." };
const myObj = Object.create( myCustomPrototype, {
    myEnumerableProp: {
        value: true,
        enumerable: true
    },
    myNonEnumerableProp: {
        value: false,
        enumerable: false
    }
});
const myNewObj = { ...myObj };

myObj;
> Object { myEnumerableProp: true,  }
    myEnumerableProp: true
    myNonEnumerableProp: false
    <prototype>: Object { protoProp: "My prototype." }

myNewObj;
> Object { myEnumerableProp: true }
    myEnumerableProp: true
    <prototype>: Object {  }

تجدر الإشارة إلى أنّه لا يمكن استخدام الصفائف والكائنات بالتبادل. لا يمكنك نشر كائن في صفيفة أو صفيف إلى كائن.

عامل تشغيل استراحة

بالرغم من أنّ بنية عامل التشغيل نفسه هي نفسها، إلّا أنّ عامل التشغيل المتبقي (...) تؤدي الدالة المعاكسة بناءً على السياق الذي يتم استخدامها فيه. بدلاً من توسيع هيكل البيانات القابلة للتكرار إلى عناصر فردية، كما هو الحال في إتلاف المهمة أو دالة الدالة، يجمع عامل التشغيل الباقي والعناصر في هيكل بيانات قابل للتكرار. يأتي الاسم من حقيقة أنه لجمع "الباقي" مجموعة من قيم البيانات.

عند استخدامها مع إتلاف المهمة، يُطلق على البنية "الخاصية الاستراحة". وبناء الجملة.

const myArray = [ "First", "Second", "Third", "Fourth", "Fifth" ];

[ myFirstElement, mySecondElement, ...remainingElements ] = myArray;

myFirstElement;
> "First"

mySecondElement;
> "Second"

remainingElements;
> Array(3) [ "Third", "Fourth", "Fifth"]

عندما تُستخدم لتوفير عدد غير محدود من الوسيطات لدالة، يسمى بناء الجملة "معلمة الراحة" بناء الجملة:

function myFunction( ...myParameters ) {
    let result = 0;
    myParameters.forEach( ( myParam ) => {
        result += myParam;
    });
    return result;
};

myFunction( 2, 2 );
> 4

myFunction( 1, 1, 1, 10, 5 );
> 18

myFunction( 10, 11, 25 );
> 46

%TypedArray%

الصفائف المكتوبة هي إحدى ميزات ES6 المصمّمة لتخزين البيانات الثنائية المنظمة، مثال عند العمل على الملفات التي تم تحميلها أو WebGL:

كما هو الحال مع الرموز، تُستخدم سمة %TypedArray% دالة intrinsic (تكون موثَّقة عادةً على أنّها %TypedArray% أو @@TypedArray) لذا لا يمكن الخلط بينها وبين خاصية عمومية) ليست دالة إنشائية في بالمعنى التقليدي، ولا يمكنك استدعاؤه باستخدام new أو استدعاؤه مباشرةً. بدلاً من ذلك، تشير السمة %TypedArray% إلى فئة رئيسية رئيسية من الأفراد الدوال الإنشائية، التي تعمل كل منها مع تنسيق بيانات ثنائية محدد. تشير رسالة الأشكال البيانية توفّر الفئة الفائقة %TypedArray% الأساسية الخصائص وطرق استخدام جميع الفئات الفرعية للدالة الإنشائية %TypedArray% وتكتسب المثيلات التابعة لها.

التحقق من فهمك

ضع في الاعتبار `const myArray = [ 30, 50, 70 ];` ماذا يعني `myArray[1]` تَعُودْ؟

70
50
30

إذا كان لـ "myArray" ثلاث قيم، فما هو ناتج "myArray[9]"؟

Undefined
9
رسالة خطأ
Null