Skip to content

Commit 2736b56

Browse files
committed
- Translate "Optional Chaining" into Arabic.
1 parent b59a482 commit 2736b56

1 file changed

Lines changed: 60 additions & 59 deletions

File tree

  • 1-js/04-object-basics/07-optional-chaining
Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,57 @@
11

2-
# Optional chaining '?.'
2+
# التسلسل الاختياري (غير الإجباري) '.?'
33

44
[recent browser="new"]
55

6-
The optional chaining `?.` is an error-proof way to access nested object properties, even if an intermediate property doesn't exist.
6+
التسلسل الاختياري `.?` هو طريقة لتجنب الأخطاء التي تهدف للوصول إلى خصائص أو حقول غرض (كائن) ما، حتى إذا لم تكن الخصائص الوسيطة موجودة.
77

8-
## The problem
8+
## المشكلة
99

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.
10+
إذا كنت قد بدأت للتو في قراءة هذه البرنامج التعليمي الخاصّ بـِ JavaScript، فربما لم تواجه هذه المشكلة من قبل ولكنها شائعة جداً.
1111

12-
For example, some of our users have addresses, but few did not provide them. Then we can't safely read `user.address.street`:
12+
فعلى سبيل المثال، يمتلك بعض مستخدمين موقعنا عناويناً، ولكن بعضاً من هؤلاء المستخدمين لم يقوموا بحفظها ضمن ملفاتهم الشخصية. بالتالي لا يمكننا كتابة التعبير التالي من دون حدوث خطأ `user.address.street` وذلك من أجل عرض اسم الشارع الخاص بالعنوان:
1313

1414
```js run
15-
let user = {}; // the user happens to be without address
15+
let user = {}; // قد لا يملك المستخدم عنواناً، كهذا الغرض على سبيل المثال
1616

17-
alert(user.address.street); // Error!
17+
alert(user.address.street); // وبالتالي يحدث الخطأ عند محاولة الوصول للخواص أو الحقول ضمنه
1818
```
1919

20-
Or, in the web development, we'd like to get an information about an element on the page, but it may not exist:
20+
أو عند الحديث عن تطوير مواقع الويب مثلاً، قد نودّ أحياناً الحصول على معلومات خاصة بعنصر من عناصر الصفحة والتي قد لا تكون موجودة بالأصل، فمثلاً:
2121

2222
```js run
23-
// Error if the result of querySelector(...) is null
23+
// يحدث الخطأ إذا كانت نتيجة التابع أو الطريقة querySelector(...) هي null
2424
let html = document.querySelector('.my-element').innerHTML;
2525
```
2626

27-
Before `?.` appeared in the language, the `&&` operator was used to work around that.
27+
قبل ظهور التركيب `.?` في اللغة، كنا نستخدم العامل `&&` لحل هذه المشكلة.
2828

29-
For example:
29+
على سبيل المثال:
3030

3131
```js run
32-
let user = {}; // user has no address
32+
let user = {}; // غرض لمستخدم لا يملك عنوان
3333

34-
alert( user && user.address && user.address.street ); // undefined (no error)
34+
alert( user && user.address && user.address.street ); // يظهر لنا undefined من دون حدوث خطأ
3535
```
3636

37-
AND'ing the whole path to the property ensures that all components exist, but is cumbersome to write.
37+
وعلى الرغم من أن إضافة العامل `&&` على طول المسار المطلوب للوصول للخاصية المناسبة يضمن وجود هذه الخاصية وعدم وقوع أخطاء، إلا أنه مرهق في الكتابة.
3838

39-
## Optional chaining
39+
## التسلسل الاختياري (غير الإجباري)
4040

41-
The optional chaining `?.` stops the evaluation and returns `undefined` if the part before `?.` is `undefined` or `null`.
41+
يؤدي التسلسل الاختياري `.?` إلى إيقاف تقييم الكود البرمجي وإرجاع `undefined` إذا كانت قيمة الجزء الموجود قبل (أيسر) التركيب `.?` هي `null` أو `undfined`.
4242

43-
Further in this article, for brevity, we'll be saying that something "exists" if it's not `null` and not `undefined`.
43+
وللإيجاز، سنقول ضمن هذه المقالة أن شيئاً ما "موجود" إذا لم تكن قيمته `null` ولم تكن `undefined` كذلك.
4444

4545

46-
Here's the safe way to access `user.address.street`:
46+
وأما الطريقة الآمنة للوصول لـِ `user.address.street` هي:
4747

4848
```js run
49-
let user = {}; // user has no address
49+
let user = {}; // غرض المستخدم التالي لا يملك خاصية العنوان
5050

51-
alert( user?.address?.street ); // undefined (no error)
51+
alert( user?.address?.street ); // سيظهر لنا بدون حدوث خطأ undefined
5252
```
5353
54-
Reading the address with `user?.address` works even if `user` object doesn't exist:
54+
وبالتالي سيبقى التعبير الخاص بقراءة عنوان المستخدم `user?.address` يعمل حتى لو لم يكن غرض المستخدم موجوداً بالأصل:
5555
5656
```js run
5757
let user = null;
@@ -62,50 +62,50 @@ alert( user?.address.street ); // undefined
6262
alert( user?.address.street.anything ); // undefined
6363
```
6464
65-
Please note: the `?.` syntax works exactly where it's placed, not any further.
65+
يرجى ملاحظة أن التركيب أو الشقّ `.?` يعمل بشكل صحيح حيث يتم وضعه بالضبط، وليس بعد ذلك المكان الذي تم وضعه فيه.
6666
67-
In the last two lines the evaluation stops immediately after `user?.`, never accessing further properties. But if the `user` actually exists, then the further intermediate properties, such as `user.address` must exist.
67+
في السطرين الأخيرين، سيتوقف تقييم الكود البرمجي بشكل فوري بعد الشقّ `.?user` ولا يستمر أبداً للخصائص التي تليه. ولكن إذا كان الغرض `user` موجوداً بالفعل، فيجب أن تكون الخصائص الوسيطة موجودة ونقصد بالخصائص الوسيطة `user.address` مثلاً.
6868
69-
```warn header="Don't overuse the optional chaining"
70-
We should use `?.` only where it's ok that something doesn't exist.
69+
```warn header="لا تفرط في استخدام تركيب التسلسل الاختياري"
70+
يجب أن نستخدم التركيب `.?` فقط عندما يكون هناك غرض، كائن أو خاصية غير موجودة بالأصل.
7171

72-
For example, if according to our coding logic `user` object must be there, but `address` is optional, then `user.address?.street` would be better.
72+
فعلى سبيل المثال، ووفقاً للمنطق المتعلق بالأمثلة السابقة، يجب أن يكون غرض المستخدم `user` موجوداً بالأصل، ولكن الخاصية `address` هي اختيارية وقد لا تكون موجودة، وبالتالي التعبير `user.address?.street` سيكون أفضل من إضافة التركيب `.?` للتحقق من كل خاصية أو حقل تابع للغرض `user?.address?.street`.
7373

74-
So, if `user` happens to be undefined due to a mistake, we'll know about it and fix it. Otherwise, coding errors can be silenced where not appropriate, and become more difficult to debug.
74+
وبالتالي، إذا كان غرض المستخدم `user` غير معرف بسبب خطأ ما، فسوف نعرف عن هذا الخطأ ونصلحه. وإلا ستتسبب هذه الطريقة بإسكات الأخطاء البرمجية وقد لا يكون ذلك مناسباً، بل سيصبح من الصعب تصحيح هذه الأخطاء وكشفها.
7575
```
7676
77-
````warn header="The variable before `?.` must exist"
78-
If there's no variable `user`, then `user?.anything` triggers an error:
77+
````warn header="المتحول الواقع قبل التركيب `.?` يجب أن يكون معرّفاً"
78+
إذا لم يتمّ تعريف المتحول `user`، سيؤدي التعبير `user?.anything` إلى حصول خطأ:
7979
8080
```js run
8181
// ReferenceError: user is not defined
8282
user?.address;
8383
```
84-
The optional chaining only tests for `null/undefined`, doesn't interfere with any other language mechanics.
84+
يقوم التسلسل الاختياري فقط باختبار القيم `null/undefined`، ولا يتداخل مع ميكانيكية أي من اللغات الأخرى.
8585
````
8686
87-
## Short-circuiting
87+
## اختصار الطرق (Short-circuiting)
8888
89-
As it was said before, the `?.` immediately stops ("short-circuits") the evaluation if the left part doesn't exist.
89+
كما تمّ ذكره آنفاً، يقوم التركيب `.?` بإيقاف عملية تقييم الكود البرمجي (يختصر الطريق) إذا لم يكن القسم اليساري (على يسار التركيب) موجوداً.
9090
91-
So, if there are any further function calls or side effects, they don't occur:
91+
لذلك، وإذا كان هنالك أي استدعاءات لتوابع، لا يتم استدعائها أو تنفيذها:
9292
9393
```js run
9494
let user = null;
9595
let x = 0;
9696

97-
user?.sayHi(x++); // nothing happens
97+
user?.sayHi(x++); // لا يحدث شيء
9898

99-
alert(x); // 0, value not incremented
99+
alert(x); // لا يتم زيادة القيمة 0
100100
```
101101
102-
## Other cases: ?.(), ?.[]
102+
## حالات أخرى ().?، [].?
103103
104-
The optional chaining `?.` is not an operator, but a special syntax construct, that also works with functions and square brackets.
104+
لا يقتصر التسلسل الاختياري `.?` في عمله على المتحولات فقط فهو ليس بعامل (رياضي) كالجمع والطرح، بل هو تركيب بنيوي يعمل أيضاً على التوابع والأقواس المربعة (أقواس المصفوفات).
105105
106-
For example, `?.()` is used to call a function that may not exist.
106+
على سبيل المثال، يمكن استخدام التركيب `().?` لاستدعاء تابع قد لا يكون معرّفاً بالأصل.
107107
108-
In the code below, some of our users have `admin` method, and some don't:
108+
في المثال أدناه، يمتلك بعض أغراض المستخدمين الطريقة (method) أو التابع المُسمى `admin` وبعضهم الآخر لا يمتلك:
109109
110110
```js run
111111
let user1 = {
@@ -122,18 +122,18 @@ user2.admin?.();
122122
*/!*
123123
```
124124
125-
Here, in both lines we first use the dot `.` to get `admin` property, because the user object must exist, so it's safe read from it.
125+
لقد استخدمنا في السطرين السابقين علامة النقطة `.` للوصول للتابع `admin` (مع عدم وجود إشارة الاستفهام) وذلك لأن غرض المستخدم `user` يجب أن يكون موجوداً من قبل ليكون من الآمن قراءة التعابير منه.
126126
127-
Then `?.()` checks the left part: if the user exists, then it runs (for `user1`). Otherwise (for `user2`) the evaluation stops without errors.
127+
وبالتالي سيقوم التعبير `().?` بفحص الجزء اليساري، فإذا كان التابع `admin` معرّفاً، فيعمل التعبير (من أجل `user1`)، وإلا (من أجل `user2`) فستتوقف عملية التقييم من دون حدوث أخطاء.
128128
129-
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.
129+
في حال الرغبة باستخدام الأقواس المربّعة `[]` بدلاً من النقطة `.` للوصول للخواص ضمن غرض أو كائن ما، سيفي التعبير `[].?` بالغرض أيضاً. وبشكل مشابه للحالات السابقة، يسمح هذا التعبير بشكل آمن قراءةَ خاصية أو حقل ضمن غرض معيّن قد لا يكون موجوداً.
130130
131131
```js run
132132
let user1 = {
133133
firstName: "John"
134134
};
135135

136-
let user2 = null; // Imagine, we couldn't authorize the user
136+
let user2 = null; // على سبيل المثال، لم يكن بإمكاننا المصادقة على وجود مستخدم ما (القيام بعملية تسجيل الدخول له)
137137

138138
let key = "firstName";
139139

@@ -143,34 +143,35 @@ alert( user2?.[key] ); // undefined
143143
alert( user1?.[key]?.something?.not?.existing); // undefined
144144
```
145145
146-
Also we can use `?.` with `delete`:
146+
كذلك يمكننا استخدام التركيب `.?` مع التعبير `delete`:
147147
148148
```js run
149-
delete user?.name; // delete user.name if user exists
149+
delete user?.name; // سيقوم بحذف اسم المستخدم في حال كان غرض المستخدم موجوداً
150150
```
151151
152-
```warn header="We can use `?.` for safe reading and deleting, but not writing"
153-
The optional chaining `?.` has no use at the left side of an assignment:
152+
```warn header="يمكننا استخدام التركيب `.?` للقراءة والحذف الآمن (بدون وقوع أخطاء)، ولكن ليس مع الكتابة (الإسناد)"
153+
لا يمكن استخدام تركيب التسلسل الاختياري `.?` في الطرف اليساري لعملية الإسناد:
154154

155155
```js run
156-
// the idea of the code below is to write user.name, if user exists
156+
// فإذا حاولنا إسناد قيمة معينة لاسم المستخدم إذا كان المستخدم موجوداً
157157
158-
user?.name = "John"; // Error, doesn't work
159-
// because it evaluates to undefined = "John"
158+
user?.name = "John"; // فسيحدث خطأ، لأن هذه الطريقة لا تعمل
159+
// لأنه سيتم تقييمها على أن
160+
// undefined = "John"
160161
```
161162

162-
## Summary
163+
## الخلاصة
163164

164-
The `?.` syntax has three forms:
165+
لتركيب التسلسل الاختياري `.?` ثلاثة أشكال:
165166

166-
1. `obj?.prop` -- returns `obj.prop` if `obj` exists, otherwise `undefined`.
167-
2. `obj?.[prop]` -- returns `obj[prop]` if `obj` exists, otherwise `undefined`.
168-
3. `obj?.method()` -- calls `obj.method()` if `obj` exists, otherwise returns `undefined`.
167+
1. `obj?.prop` -- يردّ التعبير `obj.prop` قيمةً صحيحة إذا كان الغرض `obj` موجوداً، وإلا يُعيد `undefined`.
168+
2. `obj?.[prop]` -- يردّ التعبير `obj[prop]` قيمةً صحيحة إذا كان الغرض `obj` موجوداً، وإلا يُعيد `undefined`.
169+
3. `()obj?.method` -- يقوم باستدعاء `()obj.method` إذا كان الغرض `obj` موجوداً، وإلا يُعيد `undefined`.
169170

170-
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.
171+
وكما نرى، جميع الطرق السابقة واضحة وسهلة الاستخدام. فالتركيب `.?` يتحقق من الجزء الأيسر فيما إذا لم يكن `null/undefined` ليسمح بعدها بإكمال عملية التقييم.
171172

172-
A chain of `?.` allows to safely access nested properties.
173+
وإذا كان لدينا خصائص متداخلة فيما بينها، فيسمح تسلسل من التركيب `.?` بقرائتها بشكلٍ آمن.
173174

174-
Still, we should apply `?.` carefully, only where it's ok that the left part doesn't to exist.
175+
ومع ذلك، يجب علينا استخدام التركيب `.?` بعناية (عدم الإفراط) وذلك فقط في حالة عدم تأكدنا من وجود الجزء اليساري للتركيب.
175176

176-
So that it won't hide programming errors from us, if they occur.
177+
حتى لا يخفي أخطاء البرمجة التي نرتكبها أحياناً، وذلك في حال حدثت.

0 commit comments

Comments
 (0)