مجموعه های نمایه شده

مجموعه نمایه‌سازی شده ساختار داده‌ای است که در آن عناصر با استفاده از نمایه‌های شماره‌دار ذخیره شده و قابل دسترسی هستند. مقادیر ذخیره شده در یک مجموعه نمایه شده، به شاخص های شماره گذاری شده اختصاص داده می شوند که از 0 شروع می شوند، الگویی به نام "صفر نمایه سازی". سپس می توانید به مقادیر ذخیره شده در یک مجموعه نمایه شده با ارجاع به نمایه های آنها دسترسی پیدا کنید.

آرایه

آرایه محفظه‌ای است که می‌تواند صفر یا بیشتر از هر نوع داده، از جمله اشیاء پیچیده یا آرایه‌های دیگر را در خود نگه دارد. مقادیر ذخیره شده در یک آرایه گاهی اوقات "عناصر" آرایه نامیده می شوند.

یک آرایه ایجاد کنید

مانند انواع داده های اولیه، دو رویکرد برای ایجاد یک آرایه وجود دارد: به عنوان یک آرایه تحت اللفظی، یا با فراخوانی سازنده Array() داخلی جاوا اسکریپت با new Array() . تخصیص یک آرایه به یک متغیر یک روش بسیار قابل حمل و تکرارپذیر برای تخصیص چندین مقدار به یک شناسه واحد فراهم می کند.

نحو تحت اللفظی آرایه از مجموعه ای از براکت ها ( [] ) استفاده می کند که مقادیر داده های جدا شده با کاما یا صفر را در بر می گیرد:

const myArray = [];

نحو سازنده آرایه از شی Array داخلی جاوا اسکریپت به عنوان سازنده با کلمه کلیدی 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

این رفتار از برخی از اولین تصمیمات طراحی جاوا اسکریپت باقی مانده است. از استفاده از آرایه های پراکنده در توسعه مدرن خودداری کنید.

همانند آرایه های اولیه، یک آرایه تحت اللفظی خواص و روش ها را از سازنده مربوطه خود به ارث می برد . از آنجایی که آرایه شکل خاصی از شی است، نحو لغوی آرایه و نحو 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

آرایه ها در جاوا اسکریپت ارتباطی نیستند، به این معنی که نمی توانید از یک رشته دلخواه به عنوان شاخص استفاده کنید. با این حال، مقادیر عددی مورد استفاده برای دسترسی به عناصر در یک آرایه به یک مقدار رشته در پشت صحنه اجباری می‌شوند، به این معنی که می‌توانید از یک مقدار رشته‌ای که فقط شامل کاراکترهای عددی است استفاده کنید:

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."

ساختارشکنی ارزش ها را به انواع خاصی تحمیل نمی کند. این بدان معناست که مقادیر "نادرست" ، مانند رشته‌های خالی ( "" ) یا 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

اپراتور پخش

از عملگر spread ( ... ) که در ES6 معرفی شده است برای گسترش یک ساختار داده تکرارپذیر مانند یک آرایه، رشته یا شیء تحت اللفظی به عناصر جداگانه استفاده کنید. عملگر spread بلافاصله با ساختار داده ای که باید گسترش یابد یا شناسه یک متغیر حاوی آن ساختار داده دنبال می شود.

const myArray = [ 1, 2, 3 ];

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

دستور Spread عمدتاً برای کپی و ترکیب آرایه ها استفاده می شود:

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

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

شما می توانید از syntax گسترش فقط در زمینه های زیر استفاده کنید:

برای آرایه‌ها و رشته‌ها، نحو گسترش فقط در مواردی اعمال می‌شود که صفر یا بیشتر آرگومان در یک فراخوانی تابع یا عناصر در یک آرایه مورد انتظار باشد. اولین مثال از نحو عملگر spread در این بخش کار می کند زیرا ...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

اپراتور spread برای کار با اشیاء واقعی در ES2018 گسترش یافت. همانند آرایه ها، می توانید از عملگر spread برای کپی یا ادغام اشیاء استفاده کنید:

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 }

عملگر spread کپی های "کم عمق" ایجاد می کند. این بدان معنی است که نمونه اولیه و خصوصیات غیرقابل شمارش شی اصلی را کپی نمی کند.

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 {  }

به خاطر داشته باشید که آرایه ها و اشیا را نمی توان به جای هم استفاده کرد. شما نمی توانید یک شی را در یک آرایه یا یک آرایه را در یک شی پخش کنید.

اپراتور استراحت

اگرچه نحو عملگر خود یکسان است، اما عملگر بقیه ( ... ) بر اساس زمینه ای که در آن استفاده می شود ، عملکرد مخالف را انجام می دهد. یک پارامتر تابع ، عملگر بقیه عناصر را در یک ساختار داده تکرارپذیر ترکیب می کند. این نام از این واقعیت ناشی می شود که برای جمع آوری "بقیه" مجموعه ای از مقادیر داده استفاده می شود.

هنگامی که با تخصیص ساختارشکنی استفاده می شود، نحو به آن نحو "rest milk" گفته می شود.

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

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

myFirstElement;
> "First"

mySecondElement;
> "Second"

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

هنگامی که برای ارائه تعداد نامحدودی از آرگومان ها به یک تابع استفاده می شود، نحو، دستور "rest parameter" نامیده می شود:

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 طراحی شده‌اند.

همانند Symbols ، تابع ذاتی %TypedArray% (معمولاً به صورت %TypedArray% یا @@TypedArray مستند می‌شود، بنابراین نمی‌توان آن را با یک ویژگی سراسری اشتباه گرفت) به معنای متعارف تابع سازنده نیست، و شما نمی‌توانید آن را با new فراخوانی کنید یا مستقیماً آن را فراخوانی کنید. در عوض، %TypedArray% به یک سوپرکلاس والد از سازنده‌های مجزا اشاره می‌کند که هر کدام با یک فرمت داده باینری خاص کار می‌کنند. سوپرکلاس ذاتی %TypedArray% خواص و روش‌های کاربردی را ارائه می‌کند که همه زیرکلاس‌های سازنده %TypedArray% و نمونه‌های آن‌ها به ارث می‌برند.

درک خود را بررسی کنید

با توجه به "const myArray = [ 30, 50, 70 ];" "myArray[1]" چه چیزی را برمی گرداند؟

50
30
70

اگر «myArray» سه مقدار داشته باشد، «myArray[9]» چه چیزی را برمی‌گرداند؟

Undefined
یک پیام خطا
9
Null