دو راه برای تنظیم، تغییر و دسترسی به ویژگیهای یک شی وجود دارد: نماد نقطه و نماد براکت .
نشانه گذاری نقطه
همانطور که در برخی از مثال های قبلی مشاهده شد، نماد نقطه از نقطه ( .
) بین یک شی و کلید خصوصیت مورد دسترسی استفاده می کند:
const myObj = {
"myProp": "String value."
};
myObj.myProp;
> "String value."
می توانید از نماد نقطه برای دسترسی، تغییر یا ایجاد ویژگی های جدید با استفاده از عملگرهای انتساب استفاده کنید:
const myObj = {};
myObj.myProp = "String value.";
myObj;
> Object { myProp: "String value." }
زنجیر کردن کلیدهای ویژگی با استفاده از نماد نقطه به شما امکان می دهد به خصوصیات اشیایی دسترسی پیدا کنید که خود ویژگی های یک شی هستند:
const myObj = {
"myProp": {
"childProp" : true
}
};
myObj.myProp.childProp;
> true;
با این حال، استفاده از این نحو زمانی که ممکن است کلید مشخص شده در زنجیره تعریف نشده باشد، می تواند باعث ایجاد خطا شود. در مثال زیر، myMissingProp
یک ویژگی شی myObj
نیست، بنابراین تلاش برای دسترسی به myObj.myMissingProp
منجر به undefined
می شود. تلاش برای دسترسی به یک ویژگی در undefined
، به عنوان یک شی، باعث ایجاد خطا می شود:
const myObj = {
"myProp": {
"childProp" : true
}
};
> myObj.myMissingProp
> undefined
myObj.myMissingProp.childProp;
> Uncaught TypeError: myObj.myMissingProp is undefined
برای رسیدگی به این مشکل، ES2020 یک "اپراتور اختیاری زنجیره ای" ( ?.
) را برای دسترسی ایمن به ویژگی های تو در تو اشیا معرفی کرد.
const myObj = {
"myProp": {
"childProp" : true
}
};
myObj.myMissingProp?.childProp;
> undefined
کلیدهایی که با استفاده از علامت نقطه به آنها دسترسی پیدا میکنند، مانند حرفهای رشتهای در داخل علامت نقل قول قرار نمیگیرند. این بدان معنی است که شما می توانید از نماد نقطه برای دسترسی به کلیدهای دارایی که شناسه معتبر هستند استفاده کنید:
const myObj = {
"1": true,
"key with spaces": true
};
myObj.1;
> Uncaught SyntaxError: unexpected token: numeric literal
myObj.key with spaces;
> Uncaught SyntaxError: unexpected token: keyword 'with'
به همین دلیل، بهتر است در صورت امکان از قوانین شناسه هنگام تعیین کلیدهای ویژگی پیروی کنید. اگر این امکان برای یک کلید مشخص وجود ندارد، یک نحو علامت گذاری براکت جایگزین به شما امکان می دهد کلیدهای شی مبتنی بر رشته را تنظیم کنید و به آنها دسترسی داشته باشید که از قوانین شناسه پیروی نمی کنند.
نماد براکت
نماد براکت از مجموعهای از براکتها ( []
) استفاده میکند که حاوی مقداری است که یک رشته (یا یک نماد ) را که کلید ویژگی را نشان میدهد، ارزیابی میکند.
const myObj = {
"myProp": "String value."
};
myObj["myProp"];
> "String value."
این نحو به طور قابل توجهی مجاز تر است و به طور بالقوه به اندازه ای مجاز است که گیج کننده باشد، زیرا مقدار موجود در پرانتز بدون توجه به نوع داده آن به عنوان یک رشته واقعی ارزیابی می شود. به عنوان مثال، در اینجا مقدار بولی false
و مقدار عدد 10
برای دسترسی به خصوصیات مرتبط با کلیدهای رشته ای "false"
و "10"
استفاده می شود:
const myObj = {
"false": 25,
"10" : true,
"key with spaces": true
};
myObj[false];
> 25
myObj[10];
> true
myObj["key with spaces"];
> true
نقطه قوت این نحو در انعطاف پذیری آن است که امکان استفاده از رشته های ایجاد شده به صورت پویا را برای دسترسی به ویژگی ها فراهم می کند. مثال زیر از یک عدد تصادفی برای انتخاب یکی از سه ویژگی یک شی استفاده می کند:
const colors = {
"color1" : "red",
"color2" : "blue",
"color3" : "green"
};
const randomNumber = Math.ceil( Math.random() * 3 );
colors[ "color" + randomNumber ];
> "blue"
مانند نماد نقطه، می توانید از نماد براکت برای دسترسی و ایجاد ویژگی های جدید با استفاده از عملگرهای انتساب استفاده کنید:
const myObj = {};
myObj[ "myProp" ] = "String value.";
myObj;
> Object { myProp: "String value." }