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
```warn header="از زنجیرهی اختیاری بیش از حد استفاده نکنید"
109
109
ما باید از `.?` فقط زمانی استفاده کنیم که عدم وجود چیزی اشکالی ندارد.
110
110
111
+
<<<<<<<HEAD
111
112
برای مثال، اگر طبق منطق کد ما باید شیء `user` وجود داشته باشد ولی `address` اختیاری باشد، پس ما باید اینگونه بنویسیم `user.address?.street` نه `user?.address?.street`.
112
113
113
114
بنابراین، اگر تصادفاً به دلیل اشتباهی `user` برابر با `undefined` باشد، شاهد یک خطای برنامهنویسی در مورد آن خواهیم بود و آن را برطرف خواهیم کرد. در غیر این صورت، خطاهای کد را می توان در مواردی که مناسب نیست ساکت کرد، و این کار اشکالزدایی را سختتر میکند.
115
+
=======
116
+
For example, if according to our code logic `user` object must exist, but `address` is optional, then we should write `user.address?.street`, but not `user?.address?.street`.
117
+
118
+
Then, if`user` happens to be undefined, we'll see a programming error about it and fix it. Otherwise, if we overuse `?.`, coding errors can be silenced where not appropriate, and become more difficult to debug.
119
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
114
120
```
115
121
116
122
````warn header="متغیر قبل از `.?` باید تعریف شده باشد"
@@ -127,15 +133,23 @@ user?.address;
127
133
128
134
همانطور که قبلا گفته شد عبارت `.?` اگر عبارت سمت چپ آن وجود نداشته باشد، فوراً ارزیابی را متوقف میکند (اتصال را کوتاه میکند).
129
135
136
+
<<<<<<< HEAD
130
137
بنابراین، اگر صدازدن تابعی یا عوارض جانبی دیگری وجود داشته باشند، اتفاق نمیافتند.
138
+
=======
139
+
So, if there are any further function calls or operations to the right of `?.`, they won't be made.
140
+
>>>>>>>741d90ce8a730d66e987bff5e9794d6e41cb2f05
131
141
132
142
برای نمونه:
133
143
134
144
```js run
135
145
let user = null;
136
146
let x = 0;
137
147
148
+
<<<<<<< HEAD
138
149
user?.sayHi(x++); // اجرا نمیشود x++ وجود ندارد، پس "sayHi"
150
+
=======
151
+
user?.sayHi(x++); // no "user", so the execution doesn't reach sayHi call and x++
برای مثال، برای رند کردن عدد تا دومین رقم اعشاری، میتوانیم عدد را در`۱۰۰` (یا یک توان بزرگتر ۱۰) ضرب کنیم، تابع رند کردن را صدا بزنیم و سپس دوباره تقسیم کنیم.
165
+
=======
166
+
For example, to round the number to the 2nd digit after the decimal, we can multiply the number by `100`, call the rounding function and then divide it back.
alert( num.toFixed(5) ); // "12.34000", صفر اضافه شده تا دقیقا ۵ رقم شود
185
193
```
186
194
195
+
<<<<<<< HEAD
187
196
ما میتوانیم آن را با کمک جمع واحد یا با فراخوانی `Number()` در `+num.toFixed(5)` به عدد تبدیل کنیم
197
+
=======
198
+
We can convert it to a number using the unary plus or a `Number()` call, e.g write `+num.toFixed(5)`.
199
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
188
200
189
201
## محاسبات تقریبی
190
202
191
203
در درون سیستم، یک عدد به شکل ۶۴-بیتی است [IEEE-754](http://en.wikipedia.org/wiki/IEEE_754-1985)، بنابراین دقیقا ۶۴ بیت برای ذخیرهی یک عدد داریم: ۵۲ تا از آنها برای ذخیره کردن ارقام هستند، ۱۱ تا از آنها برای ذخیره کردن جایگاه نقطهی مشخص کنندهی اعشار (که برای اعداد صحیح صفر است)، و یک بیت برای علامت آن.
192
204
205
+
<<<<<<< HEAD
193
206
اگر عددی بیش از حد بزرگ باشد، حافظهی ۶۴ بیتی سرریز میکند و مقدار بینهایت را برمیگرداند:
207
+
=======
208
+
If a number is really huge, it may overflow the 64-bit storage and become a special numeric value `Infinity`:
209
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
194
210
195
211
```js run
196
212
alert( 1e500 ); // Infinity
197
213
```
198
214
199
215
اتفاقی که زیاد مشخص نیست و کمتر اتفاق میافتد، از دست دادن دقت است.
اوه! اتفاقات بدتری تا یک مقایسهی ساده میتواند بیفتد. مثلا فرض کنید شما در فروشگاهی اینترنتی مقدار `$0.10` و `$0.20` را به حساب خود واریز میکنید. مجموع موجودی شما `$0.30000000000000004` میشود. این شکه کنندهست!
237
+
=======
238
+
Ouch! Imagine you're making an e-shopping site and the visitor puts `$0.10` and `$0.20` goods into their cart. The order total will be `$0.30000000000000004`. That would surprise anyone.
239
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
216
240
217
241
اما چرا این اتفاق میافتد؟
218
242
219
243
یک عدد در حافظه به شکل دودویی آن ذخیره میشود، مجموعهای از صفرها و یکها. اما کسرهایی مثل `0.1`، `0.2` که در سیستم اعداد اعشاری ساده به نظر میرسند در اصل کسرهای بیپایانی در شکل دودویی خود هستند.
220
244
245
+
<<<<<<< HEAD
221
246
به زبانی دیگر، `0.1` چیست؟ مقدار یک که بر ده تقسیم شده، `1/10` یعنی یک دهم. در سیستم اعداد اعشاری چنین اعدادی به سادگی قابل نمایشند. با یک سوم `1/3` مقایسه کنید. به کسری بیپایان تبدیل میشود. `0.33333(3)`
247
+
=======
248
+
What is `0.1`? It is one divided by ten `1/10`, one-tenth. In decimal numeral system such numbers are easily representable. Compare it to one-third: `1/3`. It becomes an endless fraction `0.33333(3)`.
249
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
222
250
223
251
بنابراین، تقسیم های از توان ده، قطعا در سیستم اعشاری کار میکند اما تقسیمهای بر ۳ اینطور نیست. به علت مشابه، در سیستم اعداد دودویی، تقسیم توانهای ۲ هم قطعا کار میکند اما ۱/۱۰، کسر دودویی بیپایانی میشود.
Copy file name to clipboardExpand all lines: 1-js/09-classes/03-static-properties-methods/article.md
+31Lines changed: 31 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,15 @@
1
1
2
2
# ویژگی و متدهای ایستا
3
3
4
+
<<<<<<< HEAD
4
5
ما میتوانیم یک متد را در خود تابع کلاس هم قرار دهیم، نه درون `"prototype"` آن. چنین متدهایی *ایستا (static)* نامیده میشوند.
5
6
6
7
در یک کلاس، آنها با کلمه کلیدی `static` استفاده میشوند، مثل این:
8
+
=======
9
+
We can also assign a method to the class as a whole. Such methods are called *static*.
10
+
11
+
In a class declaration, they are prepended by `static` keyword, like this:
12
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
7
13
8
14
```js run
9
15
classUser {
@@ -31,9 +37,17 @@ User.staticMethod(); // true
31
37
32
38
مقدار `this` درون فراخوانی `User.staticMethod()` برابر با کلاس سازنده یعنی خود `User` است (قانون «شیء قبل از نقطه»).
33
39
40
+
<<<<<<< HEAD
34
41
معمولا، متدهای ایستا برای پیادهسازی تابعهایی که به کلاس تعلق دارند و نه به هر شیء خاصی از آن استفاده میشوند.
35
42
36
43
برای مثال، ما شیءهای کلاس `Article` (به معنی مقاله) را داریم و به تابعی برای مقایسه آنها نیاز داریم. یک راهحل طبیعی اضافه کردن متد `Article.compare` است، مثلا اینگونه:
44
+
=======
45
+
Usually, static methods are used to implement functions that belong to the class as a whole, but not to any particular object of it.
46
+
47
+
For instance, we have `Article` objects and need a function to compare them.
48
+
49
+
A natural solution would be to add `Article.compare` static method:
اینجا `Article.compare` در «بالای» مقالهها (articles) قرار دارد، به عنوان روشی برای مقایسه آنها. این متدی برای یک مقاله(article) نیست، بلکه برای کل کلاس است.
67
82
68
83
مثال دیگر متدی به نام "factory" (به معنی تولیدکننده) است. فرض کنید، ما به چند راه برای ایجاد یک مقاله نیاز داریم:
84
+
=======
85
+
Here `Article.compare` method stands "above" articles, as a means to compare them. It's not a method of an article, but rather of the whole class.
86
+
87
+
Another example would be a so-called "factory" method.
88
+
89
+
Let's say, we need multiple ways to create an article:
90
+
>>>>>>> 741d90ce8a730d66e987bff5e9794d6e41cb2f05
69
91
70
92
1. ساختن از طریق پارامترها (`title`، `date` و غیره).
71
93
2. ساختن یک مقاله خالی با تاریخ امروز.
72
94
3. ...یا به روشی دیگر.
73
95
74
96
اولین راه میتواند با استفاده از تابع سازنده پیادهسازی شود. و برای راه دوم میتوانیم یک متد ایستا برای کلاس بسازیم.
0 commit comments