You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
###### زنجیره ای اختیاری روشی بدون خطا برای دستیابی به ویژگی های(properties) داخلی شی است حتی در زمانی که ویژگی میانی وجود نداشته باشد
3
5
4
-
[recent browser="new"]
5
6
6
-
The optional chaining `?.` is a safe way to access nested object properties, even if an intermediate property doesn't exist.
7
+
## مشکل
7
8
8
-
## The "non-existing property" problem
9
+
اگر به تازگی شروع به خواندن آموزش و یادگیری جاوا اسکریپت کرده اید ، شاید این مشکل هنوز شما را لمس نکرده اید ، اما این یک مشکل کاملاً رایج است.
9
10
10
-
If you've just started to read the tutorial and learn JavaScript, maybe the problem hasn't touched you yet, but it's quite common.
11
+
برای مثال, بیاید یک شی(object) برای اطلاعات کاربران در نظر بگیریم. تعدادی از کاربران ما آدرس را در ویژگی `user.address` و خیابان را در ویژگی `user.address.street` دارند ولی تعدادی کمی از آن ها آدرس را ارائه نکردهاند.
11
12
12
-
As an example, let's consider objects for user data. Most of our users have addresses in `user.address` property, with the street `user.address.street`, but some did not provide them.
13
+
در این صورت تلاش ما برای دستیابی به `user.address.street` با شکست مواجه خواهد شد
13
14
14
-
In such case, when we attempt to get `user.address.street`, we'll get an error:
15
15
16
16
```js run
17
17
let user = {}; // the user without "address" property
18
18
19
19
alert(user.address.street); // Error!
20
20
```
21
21
22
-
That's the expected result, JavaScript works like this, but many practical cases we'd prefer to get `undefined` instead of an error (meaning "no street").
22
+
این یک خروجی قابل حدس است٬ جاوااسکریپت اینگونه کار میکند٬ ولی در مثال های عملی ترجیح میدهیم ``undefined`` دریافت کنیم به جای خطا.
23
+
24
+
یا مثالی دیگر در توسعه وب٬ ما میخواهیم اطلاعاتی در مورد اِلمانی در صفحه را بگیریم٬ که ممکن بعضی اوقات وجود نداشته باشد :
25
+
23
26
24
-
...And another example. In the web development, we may need to get an information about an element on the page, that sometimes doesn't exist:
27
+
28
+
یا در توسعه وب٬ ما میخواهیم اطلاعاتی در مورد اِلمان در صفحه را بگیریم٬ ولی شاید وجود نداشته باشد :
25
29
26
30
```js run
27
31
// Error if the result of querySelector(...) is null
28
32
let html =document.querySelector('.my-element').innerHTML;
29
33
```
30
34
31
-
Before `?.` appeared in the language, the `&&` operator was used to work around that.
32
35
33
-
For example:
36
+
37
+
قبل از اینکه `?.` در زبان وجود داشته باشد از عمگر `&&` برای کار در این مورد استفاده میشد. برای مثال :
34
38
35
39
```js run
36
40
let user = {}; // user has no address
37
41
38
42
alert( user &&user.address&&user.address.street ); // undefined (no error)
39
43
```
40
44
41
-
AND'ing the whole path to the property ensures that all components exist (if not, the evaluation stops), but is cumbersome to write.
45
+
AND کردن کل مسیر رسیدن به ویژگی ، وجود همه اجزا را تضمین می کند(اگر ارزیابی متوقف نشود) ، اما نوشتن آن دست و پا گیر است.
46
+
47
+
48
+
## زنجیره ای اختیاری
42
49
43
-
## Optional chaining
50
+
زنجیره ای اختیاری `?.` ارزیابی را متوقف میکند اگر مقدار قبل از قسمت `?.` برابر با `undefined` یا `null` باشد و مقدار `undefined` را برمیگرداند.
44
51
45
-
The optional chaining `?.` stops the evaluation and returns `undefined` if the part before `?.` is `undefined`or`null`.
52
+
**در ادامه این مقاله ، به اختصار خواهیم گفت چیزی وجود خواهد داشت اگر که `undefined`و`null` نباشد.**
46
53
47
-
**Further in this article, for brevity, we'll be saying that something "exists" if it's not `null` and not `undefined`.**
48
54
49
-
Here's the safe way to access `user.address.street`:
55
+
56
+
این یک مسیر امن برای دستیابی `user.address.street` است :
50
57
51
58
```js run
52
59
let user = {}; // user has no address
53
60
54
61
alert( user?.address?.street ); // undefined (no error)
55
62
```
56
63
57
-
Reading the address with `user?.address` works even if `user` object doesn't exist:
64
+
65
+
66
+
خواندن آدرس با `user?.address` کار خواهد کرد حتی زمانی هم که شی `user` وجود ندارد :
Please note: the `?.` syntax makes optional the value before it, but not any further.
75
+
لطفا توجه داشته باشید : سینتکس `?.` مقدارهای قبلی را اختیاری میکند نه مقدارهای جلوی آن را.
76
+
77
+
در مثال بالا `user?.` به `user` مقدار `null/undefined` خواهد داد.
67
78
68
-
In the example above, `user?.` allows only `user` to be `null/undefined`.
69
79
70
-
On the other hand, if `user` does exist, then it must have `user.address` property, otherwise `user?.address.street` gives an error at the second dot.
71
80
72
-
```warn header="Don't overuse the optional chaining"
73
-
We should use `?.` only where it's ok that something doesn't exist.
81
+
از طرف دیگر ، اگر `user` وجود داشته باشد ، پس باید ویژگی `user.address` داشته باشد ، در غیر این صورت `user؟.address.street`در نقطه دوم خطا می دهد.
74
82
75
-
For example, if according to our coding logic `user` object must be there, but `address` is optional, then `user.address?.street` would be better.
83
+
```warn header="از زنجیر اختیاری بیش از حد استفاده تکنید"
76
84
77
-
So, if`user` happens to be undefined due to a mistake, we'll see a programming error about it and fix it. Otherwise, coding errors can be silenced where not appropriate, and become more difficult to debug.
85
+
ما باید از `?.` فقط زمانی استفاده کنیم که عدم وجود چیزی اشکالی ندارد
86
+
87
+
به عنوان مثال ، اگر مطابق منطق برنامه نویسی ما ، شی `user` باید وجود داشته باشد ولی `address` اختیاری است در آن شرایط استفاده از `user.address?.street` راه حل بهتری است ،
88
+
89
+
بنابراین ، اگر تصادفاً به دلیل اشتباهی `user` برابر با `undefined` باشد، شاهد یک خطای برنامه نویسی در مورد آن خواهیم بود و آن را برطرف خواهیم کرد. در غیر این صورت ، خطاهای کد را می توان در مواردی که مناسب نیست ساکت کرد٬ و کار اشکال زدایی را سخت تر میکند.
78
90
```
79
91
80
-
````warn header="The variable before `?.` must be declared"
81
-
If there's no variable `user` at all, then `user?.anything` triggers an error:
92
+
93
+
94
+
````warn header="متغیر قبل از ؟. باید تعریف شده باشد" اگر متغیر user به هیچ وجه وجود نداشته باشد `user?.anything` خطا خواهد داد
95
+
96
+
82
97
83
98
```js run
84
99
// ReferenceError: user is not defined
85
100
user?.address;
86
101
```
87
-
There must be a declaration (e.g. `let/const/var user`). The optional chaining works only for declared variables.
88
-
````
89
-
90
-
## Short-circuiting
102
+
باید تعریفی باشد( `let/const/varuser ` ). زنجیره ای اختیاری فقط برای متغیرهای تعریف شده کار می کند.
103
+
باید `let/const/var user ` وجود داشته باشد. زنجیره ای اختیاری فقط برای متغیرهای تعریف شده کار می کند.
91
104
92
-
As it was said before, the `?.` immediately stops ("short-circuits") the evaluation if the left part doesn't exist.
105
+
````
93
106
94
-
So, if there are any further function calls or side effects, they don't occur.
107
+
## اتصال کوتاه
108
+
همانطور که قبلا گفته شد عبارت `?.` فوراً ارزیابی را متوقف میکند(اتصال کوتاه) اگر عبارت سمت چپ آن وجود نداشته باشد.
109
+
بنابراین ، اگر صدا زدن تابعی یا عوارض جانبی دیگری وجود داشته باشد ، اتفاق نمیافتد.
95
110
96
-
For instance:
111
+
برای نمونه :
97
112
98
-
```js run
113
+
```js run
99
114
let user = null;
100
115
let x = 0;
101
116
@@ -104,13 +119,15 @@ user?.sayHi(x++); // no "sayHi", so the execution doesn't reach x++
104
119
alert(x); // 0, value not incremented
105
120
```
106
121
107
-
## Other variants:?.(), ?.[]
108
122
109
-
The optional chaining `?.` is not an operator, but a special syntax construct, that also works with functions and square brackets.
110
123
111
-
For example, `?.()` is used to call a function that may not exist.
124
+
## ?.(), ?.[] : و موارد دیگر
125
+
126
+
زنجیره اختیاری `?.` یک عمگر نیست بلکه یک ساختار سینتکسی خاص است که با توابع و براکت ها نیز کار می کند
127
+
128
+
برای مثال `?.()` برای صدا زدن تابعی که ممکن است وجود نداشته باشد هم کاربرد دارد
112
129
113
-
In the code below, some of our users have `admin` method, and some don't:
130
+
در کد زیر٬ برخی از کاربران ما متد `admin`را دارند و برخی خیر :
114
131
115
132
```js run
116
133
let user1 = {
@@ -127,11 +144,11 @@ user2.admin?.();
127
144
*/!*
128
145
```
129
146
130
-
Here, in both lines we first use the dot (`user1.admin`) to get `admin`property, because the user object must exist, so it's safe read from it.
147
+
در اینجا در هر دو خط ما ابتدا از `.`(`user1.admin`) برای گرفتن ویژگی `admin`استفاده میکنیم به خاطر اینکه شی `user` حتما وجود دارد پس برای خواندن از آن مطمئن هستیم.
131
148
132
-
Then`?.()`checks the left part: if the admin function exists, then it runs (that's so for `user1`). Otherwise (for`user2`) the evaluation stops without errors.
149
+
سپس`?.()`عبارت سمت چپ را بررسی میکند: اگر تابع `admin` وجود داشته باشد آنرا اجرا میکند(برای `user1`) در غیر اینصورت(برای`user2`) محاسبات بدون خطا به متوقف میشود.
133
150
134
-
The `?.[]`syntax also works, if we'd like to use brackets `[]` to access properties instead of dot `.`. Similar to previous cases, it allows to safely read a property from an object that may not exist.
151
+
سینتکس برای حالت `?.[]`نیز کار میکند٬ اگر ما میخواهیم از براکت به جای نقطه برای دستیابی به ویژگیها استفاده کنیم مشابه موارد قبلی ، اجازه می دهد تا با خیال راحت یک ویژگی را از یک شی که ممکن است وجود نداشته باشد، را بخوانیم.
همانطور که می بینیم ، همه آنها ساده و آسان برای استفاده هستند. `?.` سمت چپ را از نظر `null/undefined` بررسی می کند و اجازه می دهد تا ارزیابی ادامه یابد اگر برابر با `null/undefined` نباشد.
178
202
179
-
As we can see, all of them are straightforward and simple to use. The `?.`checks the left part for `null/undefined` and allows the evaluation to proceed if it's not so.
203
+
زنجیر `?.`امکان دسترسی به خواص تودرتو را فراهم میکند.
180
204
181
-
A chain of `?.`allows to safely access nested properties.
205
+
با این حال هنوز ما باید `?.`را با دقت اعمال کنیم ، فقط درصورتی قابل قبو است که سمت چپ ممکن است وجود نداشته باشد.
182
206
183
-
Still, we should apply `?.` carefully, only where it's acceptable that the left part doesn't to exist. So that it won't hide programming errors from us, if they occur.
207
+
با این حال خطاهای برنامه نویسی را از ما مخفی نمیکند اگر آنها اتفاق بیافتند.
0 commit comments