From f97c409e2edbc0b7cd84d8fb39c9dd1ceef0f047 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 17:59:29 +0430 Subject: [PATCH 01/24] Translated article --- .../02-rest-parameters-spread/article.md | 198 +++++++++--------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index c63fe70cd..fd57b3982 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -1,20 +1,20 @@ -# Rest parameters and spread syntax +# پارامتر‌های اضافی و سینتکس گسترش -Many JavaScript built-in functions support an arbitrary number of arguments. +بسیاری از توابع جاوا‌اسکریپت از تعداد دلخواه آرگومان‌ها پشتیبانی می کنند. -For instance: +برای مثال: -- `Math.max(arg1, arg2, ..., argN)` -- returns the greatest of the arguments. -- `Object.assign(dest, src1, ..., srcN)` -- copies properties from `src1..N` into `dest`. -- ...and so on. +- `Math.max(arg1, arg2, ..., argN)` -- بزرگترین عدد میان آرگومان ها را برمی‌گرداد. +- `Object.assign(dest, src1, ..., srcN)` -- رونوشت میکند `src1..N` را در `dest`. +- ...و غیره. -In this chapter we'll learn how to do the same. And also, how to pass arrays to such functions as parameters. +در این فصل با نحوه انجام این کار آشنا می شویم. و همچنین نحوه انتقال آرایه به توابع به عنوان پارامتر(ها) را یاد خواهیم گرفت. -## Rest parameters `...` +## پارامتر‌های اضافی `...` -A function can be called with any number of arguments, no matter how it is defined. +یک تابع را می توان با هر تعداد آرگومان، صرف نظر از نحوه تعریف آن، فراخوانی کرد. -Like here: +مانند اینجا: ```js run function sum(a, b) { return a + b; @@ -23,14 +23,14 @@ function sum(a, b) { alert( sum(1, 2, 3, 4, 5) ); ``` -There will be no error because of "excessive" arguments. But of course in the result only the first two will be counted. +به دلیل آرگومان‌های بیش از اندازه هیچ خطایی وجود نخواهد داشت. البته در نتیجه فقط دو مورد اول محاسبه خواند شد. -The rest of the parameters can be included in the function definition by using three dots `...` followed by the name of the array that will contain them. The dots literally mean "gather the remaining parameters into an array". +بقیه پارامترها را می توان با استفاده از سه نقطه `...` در قسمت تعریف تابع گنجاند و به دنبال آن نام آرایه ای که آنها را شامل است نوشت. نقاط به صورت تحت الفظی به معنی "جمع آوری پارامترهای باقی مانده (اضافی) در یک آرایه" است. -For instance, to gather all arguments into array `args`: +برای مثال، برای جمع آوری تمام آرگومان ها در آرایه `args`: ```js run -function sumAll(...args) { // args is the name for the array +function sumAll(...args) { // args نام آرایه است let sum = 0; for (let arg of args) sum += arg; @@ -43,41 +43,41 @@ alert( sumAll(1, 2) ); // 3 alert( sumAll(1, 2, 3) ); // 6 ``` -We can choose to get the first parameters as variables, and gather only the rest. +ما می توانیم اولین پارامترها را به عنوان متغیر دریافت کنیم و بقیه را جمع آوری کنیم. -Here the first two arguments go into variables and the rest go into `titles` array: +در اینجا دو آرگومان اول به متغیرها و بقیه به آرایه `title` تبدیل میشوند: ```js run function showName(firstName, lastName, ...titles) { alert( firstName + ' ' + lastName ); // Julius Caesar - // the rest go into titles array - // i.e. titles = ["Consul", "Imperator"] - alert( titles[0] ); // Consul - alert( titles[1] ); // Imperator + // پارامتر اضافی به آرایه "title" تبدیل می‌شود + // یعنی titles = ["مشاور", "امپراطور"] + alert( titles[0] ); // مشاور + alert( titles[1] ); // امپراطور alert( titles.length ); // 2 } -showName("Julius", "Caesar", "Consul", "Imperator"); +showName("پیام", "مرادی", "مشاور", "امپراطور"); ``` -````warn header="The rest parameters must be at the end" -The rest parameters gather all remaining arguments, so the following does not make sense and causes an error: +````warn header="پارامتر های اضافی باید در انتها باشند" +پارامترهای اضافی همه آرگومان های باقی مانده را جمع آوری می کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: ```js -function f(arg1, ...rest, arg2) { // arg2 after ...rest ?! - // error +function f(arg1, ...rest, arg2) { // arg2 بعد از ...rest ?! + // ارور } ``` -The `...rest` must always be last. +`...rest` همیشه باید در آخر باشد. ```` -## The "arguments" variable +## متغیر "arguments" -There is also a special array-like object named `arguments` that contains all arguments by their index. +همچنین یک آبجکت آرایه مانند ویژه به نام `arguments` وجود دارد که شامل همه آرگومان ها بر اساس ترتیب فهرست آنها است. -For instance: +برای مثال: ```js run function showName() { @@ -85,29 +85,29 @@ function showName() { alert( arguments[0] ); alert( arguments[1] ); - // it's iterable + // قابل تکرار است // for(let arg of arguments) alert(arg); } -// shows: 2, Julius, Caesar -showName("Julius", "Caesar"); +// نشان می‌دهد: 2, پیام, مرادی +showName("پیام", "مرادی"); -// shows: 1, Ilya, undefined (no second argument) -showName("Ilya"); +// نشان می‌دهد: 1, ایلیا, تعریف نشده (undefined) (آرگومان دوم وجود ندارد) +showName("ایلیا"); ``` -In old times, rest parameters did not exist in the language, and using `arguments` was the only way to get all arguments of the function. And it still works, we can find it in the old code. +در زمان های قدیم، ویژگی پارامترهای اضافی در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌های تابع بود. و هنوز کار می کند، می توانیم آن را در کد قدیمی پیدا کنیم. -But the downside is that although `arguments` is both array-like and iterable, it's not an array. It does not support array methods, so we can't call `arguments.map(...)` for example. +اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار ، اما یک آرایه نیست. از متد‌های آرایه پشتیبانی نمی کند ، بنابراین نمی توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. -Also, it always contains all arguments. We can't capture them partially, like we did with rest parameters. +همچنین همیشه شامل همه آرگومان‌ها است. ما نمی‌توانیم آنها را تا حد مشخصی به دست بیاوریم، مانند کاری که با پارامتر‌های اضافی کردیم. -So when we need these features, then rest parameters are preferred. +بنابراین وقتی به این ویژگی ها نیاز داریم، پارامترهای اضافی ترجیح داده می شود. -````smart header="Arrow functions do not have `\"arguments\"`" -If we access the `arguments` object from an arrow function, it takes them from the outer "normal" function. +````smart header="توابع تک خطی آبجکت `\"arguments\"` ندارند" +اگر از یک تابع تک خطی به آبجکت `arguments` دسترسی پیدا کنیم ، آنها را از تابع "عادی" بیرونی خارج می کند. -Here's an example: +در اینجا یک مثال وجود دارد: ```js run function f() { @@ -118,49 +118,49 @@ function f() { f(1); // 1 ``` -As we remember, arrow functions don't have their own `this`. Now we know they don't have the special `arguments` object either. -```` +همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `argument` خاصی نیز ندارند. + -## Spread syntax [#spread-syntax] +## سینتکس گسترش [#spread-syntax] -We've just seen how to get an array from the list of parameters. +ما فقط نحوه گرفتن یک آرایه از لیست پارامترها را دیدیم. -But sometimes we need to do exactly the reverse. +اما گاهی اوقات ما باید دقیقاً برعکس عمل کنیم. -For instance, there's a built-in function [Math.max](mdn:js/Math/max) that returns the greatest number from a list: +برای مثال ، یک تابع داخلی [Math.max](mdn: js/Math/max) وجود دارد که بیشترین عدد را از یک لیست بر می گرداند: ```js run alert( Math.max(3, 5, 1) ); // 5 ``` -Now let's say we have an array `[3, 5, 1]`. How do we call `Math.max` with it? +حالا فرض کنید یک آرایه داریم `[3, 5, 1]`. چگونه با آن تابع `Math.max` را فراخوانی کنیم؟ -Passing it "as is" won't work, because `Math.max` expects a list of numeric arguments, not a single array: +وارد کردن آن "همانطور که هست" کار نخواهد کرد ، زیرا `Math.max` لیستی از آرگومان های عددی را انتظار دارد ، نه یک آرایه واحد: ```js run let arr = [3, 5, 1]; *!* alert( Math.max(arr) ); // NaN -*/!* +*/!* ``` -And surely we can't manually list items in the code `Math.max(arr[0], arr[1], arr[2])`, because we may be unsure how many there are. As our script executes, there could be a lot, or there could be none. And that would get ugly. +و مطمئناً ما نمی توانیم مواردی را در تابع `Math.max (arr [0] ، arr [1] ، arr [2])` به صورت دستی لیست کنیم ، زیرا ممکن است مطمئن نباشیم تعداد آنها چقدر است. همانطور که اسکریپت ما اجرا می شود ، ممکن است تعداد زیادی (آرگومان) وجود داشته باشد ، یا ممکن است وجود نداشته باشد. و این باعث زشتی کد ما می شود. -*Spread syntax* to the rescue! It looks similar to rest parameters, also using `...`, but does quite the opposite. +*سینتکس گسترش* برای نجات! شبیه به پارامتر های اضافی به نظر می‌رسد، همچنین از `...` استفاده می‌کند، اما کاملا متفاوت است. -When `...arr` is used in the function call, it "expands" an iterable object `arr` into the list of arguments. +هنگامی که از `...arr` در فراخوانی تابع استفاده میشود، یک آبجکت `arr` قابل تکرار را در لیست آرگومان ها قرار میدهد. -For `Math.max`: +برای `Math.max`: ```js run let arr = [3, 5, 1]; -alert( Math.max(...arr) ); // 5 (spread turns array into a list of arguments) +alert( Math.max(...arr) ); // 5 (سینتکس گسترش یک آرایه را به لیستی از آرگومان ها تبدیل می‌کند) ``` -We also can pass multiple iterables this way: +همچنین می‌توان چند مورد (آبجکت) قابل تکرار را از این طریق به عنوان آرگومان به تابع انتقال داد: ```js run let arr1 = [1, -2, 3, 4]; @@ -169,7 +169,7 @@ let arr2 = [8, 3, -8, 1]; alert( Math.max(...arr1, ...arr2) ); // 8 ``` -We can even combine the spread syntax with normal values: +حتی میتوان سینتکس گسترش را با مقادیر معمولی ترکیب کرد: ```js run @@ -179,7 +179,7 @@ let arr2 = [8, 3, -8, 1]; alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25 ``` -Also, the spread syntax can be used to merge arrays: +همچنین سینتکس گسترش می‌تواند برای ادغام آرایه ها استفاده شود: ```js run let arr = [3, 5, 1]; @@ -189,107 +189,107 @@ let arr2 = [8, 9, 15]; let merged = [0, ...arr, 2, ...arr2]; */!* -alert(merged); // 0,3,5,1,2,8,9,15 (0, then arr, then 2, then arr2) +alert(merged); // 0,3,5,1,2,8,9,15 (0, سپس arr, سپس 2, سپس arr2) ``` -In the examples above we used an array to demonstrate the spread syntax, but any iterable will do. +در مثال های بالا ما از آرایه برای نشان دادن سینتکس گسترش استفاده کردیم، اما برای هر مورد قابل تکرار قابل استفاده است -For instance, here we use the spread syntax to turn the string into array of characters: +برای مثال، در اینجا از سینتکس گسترش برای تبدیل رشته به آرایه ای از کاراکتر ها استفاده میکنیم: ```js run -let str = "Hello"; +let str = "سلام"; -alert( [...str] ); // H,e,l,l,o +alert( [...str] ); // س، ل، ا، م ``` -The spread syntax internally uses iterators to gather elements, the same way as `for..of` does. +نحو گسترش به صورت داخلی از تکرارکنندگان برای جمع آوری المنت‌ها استفاده می کند ، همانطور که `for..of` این کار را انجام میدهد. -So, for a string, `for..of` returns characters and `...str` becomes `"H","e","l","l","o"`. The list of characters is passed to array initializer `[...str]`. +بنابراین ، برای یک رشته ، `for..of` کاراکترها را برمی گرداند و با استفاده از` ... str` به "H" ، "e" ، "l" ، "l" ، "o" ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه "[... str]" منتقل می شود. -For this particular task we could also use `Array.from`, because it converts an iterable (like a string) into an array: +برای این کار خاص همچنین می توانیم از `Array.from` استفاده کنیم ، زیرا یک تکرار شونده (مانند یک رشته) را به یک آرایه تبدیل می کند: ```js run let str = "Hello"; -// Array.from converts an iterable into an array -alert( Array.from(str) ); // H,e,l,l,o +// Array.from یک قابل تکرار را به آرایه تبدیل می‌کند +alert( Array.from(str) ); // س، ل، ا، م ``` -The result is the same as `[...str]`. +نتیجه مانند نتیجه هنگام استفاده از `[...str]` است. -But there's a subtle difference between `Array.from(obj)` and `[...obj]`: +اما بین "Array.from (obj)" و "[... obj]" یک تفاوت ظریف وجود دارد: -- `Array.from` operates on both array-likes and iterables. -- The spread syntax works only with iterables. +- `Array.from` هم بر روی "آرایه مانند" و هم بر روی "تکرار شونده" کار می‌کند. +- سینتکس گسترش فقط بر روی "تکرار شونده ها" کار می‌کند. -So, for the task of turning something into an array, `Array.from` tends to be more universal. +بنابراین ، برای تبدیل چیزی به یک آرایه ، Array.from بیشتر جهانی است. -## Copy an array/object +## کپی کردن یک آرایه/آبجکت -Remember when we talked about `Object.assign()` [in the past](info:object-copy#cloning-and-merging-object-assign)? +زمانی که ما در مورد `Object.assign()` [در گذشته صحبت کردیم را به یاد دارید](info:object-copy#cloning-and-merging-object-assign)? -It is possible to do the same thing with the spread syntax. +انجام همان کار با سینتکس گسترش امکان پذیز است. ```js run let arr = [1, 2, 3]; *!* -let arrCopy = [...arr]; // spread the array into a list of parameters - // then put the result into a new array +let arrCopy = [...arr]; // یک آرایه را به لیستی از پارامتر ها گسترش می‌دهد + // سپس نتیجه را در یک آرایه جدید قرار می‌دهد */!* -// do the arrays have the same contents? +// آیا آریه ها محتوای یکسانی دارند؟ alert(JSON.stringify(arr) === JSON.stringify(arrCopy)); // true // are the arrays equal? -alert(arr === arrCopy); // false (not same reference) +alert(arr === arrCopy); // false (مرجع یکسان نیست) -// modifying our initial array does not modify the copy: +// اصلاح آرایه اولیه باعث ایجاد تغییر در کپی نمی‌شود: arr.push(4); alert(arr); // 1, 2, 3, 4 alert(arrCopy); // 1, 2, 3 ``` -Note that it is possible to do the same thing to make a copy of an object: +توجه داشته باشید که برای ایجاد یک کپی از یک آبجکت می توان همان کار را انجام داد: ```js run let obj = { a: 1, b: 2, c: 3 }; *!* -let objCopy = { ...obj }; // spread the object into a list of parameters - // then return the result in a new object +let objCopy = { ...obj }; // آبجکت را به لیستی از پارامتر ها گسترش می‌دهد + // سپس نتیجه را در یک آبجکت جدید برمی‌گرداند */!* -// do the objects have the same contents? +// آیا آبجکت ها محتوای یکسانی دارند؟ alert(JSON.stringify(obj) === JSON.stringify(objCopy)); // true -// are the objects equal? -alert(obj === objCopy); // false (not same reference) +// آیا آبجکت ها برابر هستند؟ +alert(obj === objCopy); // false (مرجع یکسان نیست) -// modifying our initial object does not modify the copy: +// اصلاح آبجکت اولیه باعث تغییر در ایجاد تغییر در آبجکت کپی نمی‌شود: obj.d = 4; alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -This way of copying an object is much shorter than `let objCopy = Object.assign({}, obj)` or for an array `let arrCopy = Object.assign([], arr)` so we prefer to use it whenever we can. +این روش کپی کردن یک آبجکت بسیار کوتاه‌تر از `let objCopy = Object.assign ({}، obj )` و یا برای یک آرایه `arrCopy = Object.assign ([]، arr )` است ، بنابراین ما ترجیح می دهیم هر زمان که میتوانیم از آن استفاده کنیم. -## Summary +## خلاصه -When we see `"..."` in the code, it is either rest parameters or the spread syntax. +هنگای که در کد `" ... "` را می‌بینیم، این عبارت یا پارامتر های اضافی است یا سینتکس گسترش. -There's an easy way to distinguish between them: +یک راه آسان برای تشخیص تمایز بین آنها وجود دارد: -- When `...` is at the end of function parameters, it's "rest parameters" and gathers the rest of the list of arguments into an array. -- When `...` occurs in a function call or alike, it's called a "spread syntax" and expands an array into a list. +- وقتی `...` در انتهای پارامترهای تابع قرار دارد ، "پارامترهای اضافی" است و بقیه لیست آرگومان ها را در یک آرایه جمع آوری می کند. +- وقتی `...` در فراخوانی یک تابع یا در موقعیت مانند آن نوشته می‌شود ، آن را" سینتکس گسترش "می نامند و یک آرایه را به یک لیست گسترش می دهد. -Use patterns: +از الگو ها استفاده کنید: -- Rest parameters are used to create functions that accept any number of arguments. -- The spread syntax is used to pass an array to functions that normally require a list of many arguments. +- پارامتر‌های اضافی برای ایجاد توابعی که هر تعداد آرگومان را بپذیرند استفاده می شوند. +- سینتکس گسترش برای انتقال یک آرایه به توابعی که معمولاً به لیست آرگومان های زیادی نیاز دارند ، استفاده می شود. -Together they help to travel between a list and an array of parameters with ease. +آنها با هم کمک می‌کنند به جابه‌جایی آسان بین یک لیست و یک آرایه از پارامتر‌ها -All arguments of a function call are also available in "old-style" `arguments`: array-like iterable object. +تمام آرگومان های یک فراخوانی تابع نیز در "سبک قدیمی" `arguments`: آبجکت آرایه مانند قابل تکرار موجود است From e279e80dc64719d619e2be9a99e4c292a76e23f4 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 18:02:47 +0430 Subject: [PATCH 02/24] Translated article --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index fd57b3982..456c9c3cf 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -122,7 +122,7 @@ f(1); // 1 -## سینتکس گسترش [#spread-syntax] +## سینتکس گسترش ما فقط نحوه گرفتن یک آرایه از لیست پارامترها را دیدیم. From da80381833279cad71f324826f9eccf45e3b14b4 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 18:05:47 +0430 Subject: [PATCH 03/24] Translated article --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 456c9c3cf..187e2aad0 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -119,7 +119,7 @@ f(1); // 1 ``` همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `argument` خاصی نیز ندارند. - +```` ## سینتکس گسترش From 5f631bfcc25fcf319f2c024a0781c7d0398569f2 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 18:06:51 +0430 Subject: [PATCH 04/24] Translated article --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 187e2aad0..456c9c3cf 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -119,7 +119,7 @@ f(1); // 1 ``` همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `argument` خاصی نیز ندارند. -```` + ## سینتکس گسترش From 3a93941290d934e51d494c6e7e2d900c41adca45 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 18:13:59 +0430 Subject: [PATCH 05/24] Translated article --- .../06-advanced-functions/02-rest-parameters-spread/article.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 456c9c3cf..d91b4559c 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -64,7 +64,7 @@ showName("پیام", "مرادی", "مشاور", "امپراطور"); ````warn header="پارامتر های اضافی باید در انتها باشند" پارامترهای اضافی همه آرگومان های باقی مانده را جمع آوری می کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: -```js +```js run function f(arg1, ...rest, arg2) { // arg2 بعد از ...rest ?! // ارور } @@ -119,7 +119,6 @@ f(1); // 1 ``` همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `argument` خاصی نیز ندارند. - ## سینتکس گسترش From c21c6741be67cb7aabea520df8daa2fd753409b1 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 18:15:08 +0430 Subject: [PATCH 06/24] Translated article --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index d91b4559c..c46267cce 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -64,7 +64,7 @@ showName("پیام", "مرادی", "مشاور", "امپراطور"); ````warn header="پارامتر های اضافی باید در انتها باشند" پارامترهای اضافی همه آرگومان های باقی مانده را جمع آوری می کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: -```js run +```js function f(arg1, ...rest, arg2) { // arg2 بعد از ...rest ?! // ارور } From 39f90a915dc5d87eaf7aeb0beeeefb6d2b37788a Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Tue, 31 Aug 2021 18:32:19 +0430 Subject: [PATCH 07/24] Translated article --- .../02-rest-parameters-spread/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index c46267cce..f25495e08 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -49,7 +49,7 @@ alert( sumAll(1, 2, 3) ); // 6 ```js run function showName(firstName, lastName, ...titles) { - alert( firstName + ' ' + lastName ); // Julius Caesar + alert( firstName + ' ' + lastName ); // پیام مرادی // پارامتر اضافی به آرایه "title" تبدیل می‌شود // یعنی titles = ["مشاور", "امپراطور"] @@ -96,11 +96,11 @@ showName("پیام", "مرادی"); showName("ایلیا"); ``` -در زمان های قدیم، ویژگی پارامترهای اضافی در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌های تابع بود. و هنوز کار می کند، می توانیم آن را در کد قدیمی پیدا کنیم. +در زمان های قدیم، ویژگی پارامترهای اضافی در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌های تابع بود. و هنوز کار می کند، می توانیم آن را در کدهای قدیمی پیدا کنیم. اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار ، اما یک آرایه نیست. از متد‌های آرایه پشتیبانی نمی کند ، بنابراین نمی توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. -همچنین همیشه شامل همه آرگومان‌ها است. ما نمی‌توانیم آنها را تا حد مشخصی به دست بیاوریم، مانند کاری که با پارامتر‌های اضافی کردیم. +همچنین همیشه شامل همه آرگومان‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌های اضافی کردیم. بنابراین وقتی به این ویژگی ها نیاز داریم، پارامترهای اضافی ترجیح داده می شود. @@ -159,7 +159,7 @@ let arr = [3, 5, 1]; alert( Math.max(...arr) ); // 5 (سینتکس گسترش یک آرایه را به لیستی از آرگومان ها تبدیل می‌کند) ``` -همچنین می‌توان چند مورد (آبجکت) قابل تکرار را از این طریق به عنوان آرگومان به تابع انتقال داد: +همچنین می‌توان چند مورد قابل تکرار را از این طریق به عنوان آرگومان به تابع انتقال داد: ```js run let arr1 = [1, -2, 3, 4]; @@ -241,7 +241,7 @@ let arrCopy = [...arr]; // یک آرایه را به لیستی از پارام // آیا آریه ها محتوای یکسانی دارند؟ alert(JSON.stringify(arr) === JSON.stringify(arrCopy)); // true -// are the arrays equal? +// آیا آرایه ها برابر هستند؟ alert(arr === arrCopy); // false (مرجع یکسان نیست) // اصلاح آرایه اولیه باعث ایجاد تغییر در کپی نمی‌شود: From 557028f29214312988f537a39c1787b6fbbda364 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Wed, 1 Sep 2021 10:18:53 +0430 Subject: [PATCH 08/24] Change `argument` to `arguments` --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index f25495e08..af73b6e5f 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -118,7 +118,7 @@ function f() { f(1); // 1 ``` -همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `argument` خاصی نیز ندارند. +همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `arguments` خاصی نیز ندارند. ## سینتکس گسترش From 0c8edd798f970e8d0defb3144d804b2753677075 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Wed, 1 Sep 2021 10:29:23 +0430 Subject: [PATCH 09/24] Add URL to `spread-syntax` --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index af73b6e5f..57c84c209 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -121,7 +121,7 @@ f(1); // 1 همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `arguments` خاصی نیز ندارند. -## سینتکس گسترش +## سینتکس گسترش [#spread-syntax] ما فقط نحوه گرفتن یک آرایه از لیست پارامترها را دیدیم. From c30a1ccc641cfae7af8ade9f9901d1c2f92c7a60 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Wed, 1 Sep 2021 10:35:48 +0430 Subject: [PATCH 10/24] Change some words --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 57c84c209..f6b6666e5 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -277,7 +277,7 @@ alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ## خلاصه -هنگای که در کد `" ... "` را می‌بینیم، این عبارت یا پارامتر های اضافی است یا سینتکس گسترش. +هنگامی که در کد `" ... "` را می‌بینیم، این عبارت یا پارامتر های اضافی است یا سینتکس گسترش. یک راه آسان برای تشخیص تمایز بین آنها وجود دارد: From 88a1e4cc61eaa051a0d6ade45d61f99fc344149f Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Wed, 1 Sep 2021 20:57:18 +0430 Subject: [PATCH 11/24] Problems solved --- .../02-rest-parameters-spread/article.md | 121 +++++++++--------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index f6b6666e5..af2b6f19b 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -1,18 +1,18 @@ -# پارامتر‌های اضافی و سینتکس گسترش +# پارامتر‌های رست و سینتکس اسپرد -بسیاری از توابع جاوا‌اسکریپت از تعداد دلخواه آرگومان‌ها پشتیبانی می کنند. +بسیاری از توابع جاوا‌اسکریپت از تعداد دلخواه آرگومان‌‌ها پشتیبانی می‌کنند. برای مثال: -- `Math.max(arg1, arg2, ..., argN)` -- بزرگترین عدد میان آرگومان ها را برمی‌گرداد. -- `Object.assign(dest, src1, ..., srcN)` -- رونوشت میکند `src1..N` را در `dest`. +- `Math.max(arg1, arg2, ..., argN)` -- بزرگترین عدد میان آرگومان‌ها را برمی‌گرداند. +- `Object.assign(dest, src1, ..., srcN)` -- کپی می‌کند `src1..N` را در `dest`. - ...و غیره. -در این فصل با نحوه انجام این کار آشنا می شویم. و همچنین نحوه انتقال آرایه به توابع به عنوان پارامتر(ها) را یاد خواهیم گرفت. +در این فصل با نحوه انجام این کار آشنا می‌شویم. و همچنین نحوه انتقال آرایه به توابع به عنوان پارامتر(ها) را یاد خواهیم گرفت. -## پارامتر‌های اضافی `...` +## پارامتر‌‌های رست `...` -یک تابع را می توان با هر تعداد آرگومان، صرف نظر از نحوه تعریف آن، فراخوانی کرد. +یک تابع را می‌توان با هر تعداد آرگومان، صرف نظر از نحوه تعریف آن، فراخوانی کرد. مانند اینجا: ```js run @@ -23,11 +23,11 @@ function sum(a, b) { alert( sum(1, 2, 3, 4, 5) ); ``` -به دلیل آرگومان‌های بیش از اندازه هیچ خطایی وجود نخواهد داشت. البته در نتیجه فقط دو مورد اول محاسبه خواند شد. +به دلیل آرگومان‌های بیش از اندازه هیچ خطایی وجود نخواهد داشت. البته در نتیجه فقط دو مورد اول محاسبه خواهند شد. -بقیه پارامترها را می توان با استفاده از سه نقطه `...` در قسمت تعریف تابع گنجاند و به دنبال آن نام آرایه ای که آنها را شامل است نوشت. نقاط به صورت تحت الفظی به معنی "جمع آوری پارامترهای باقی مانده (اضافی) در یک آرایه" است. +بقیه پارامتر‌ها را می‌توان با استفاده از سه نقطه `...` در قسمت تعریف تابع گنجاند و به دنبال آن نام آرایه ای که آنها را شامل است نوشت. نقاط به صورت تحت الفظی به معنی "جمع آوری پارامتر‌های باقی مانده (رست) در یک آرایه" است. -برای مثال، برای جمع آوری تمام آرگومان ها در آرایه `args`: +برای مثال، برای جمع آوری تمام آرگومان‌ها در آرایه `args`: ```js run function sumAll(...args) { // args نام آرایه است @@ -43,15 +43,15 @@ alert( sumAll(1, 2) ); // 3 alert( sumAll(1, 2, 3) ); // 6 ``` -ما می توانیم اولین پارامترها را به عنوان متغیر دریافت کنیم و بقیه را جمع آوری کنیم. +ما می‌توانیم اولین پارامتر‌ها را به عنوان متغیر دریافت کنیم و بقیه را جمع آوری کنیم. -در اینجا دو آرگومان اول به متغیرها و بقیه به آرایه `title` تبدیل میشوند: +در اینجا دو آرگومان اول به متغیر و بقیه به آرایه `title` تبدیل می‌شوند: ```js run function showName(firstName, lastName, ...titles) { alert( firstName + ' ' + lastName ); // پیام مرادی - // پارامتر اضافی به آرایه "title" تبدیل می‌شود + // پارامتر رست به آرایه "title" تبدیل می‌شود // یعنی titles = ["مشاور", "امپراطور"] alert( titles[0] ); // مشاور alert( titles[1] ); // امپراطور @@ -61,8 +61,8 @@ function showName(firstName, lastName, ...titles) { showName("پیام", "مرادی", "مشاور", "امپراطور"); ``` -````warn header="پارامتر های اضافی باید در انتها باشند" -پارامترهای اضافی همه آرگومان های باقی مانده را جمع آوری می کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: +````warn header="پارامتر‌های رست باید در انتها باشند" +پارامتر‌های رست همه آرگومان‌های باقی مانده را جمع آوری می‌کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: ```js function f(arg1, ...rest, arg2) { // arg2 بعد از ...rest ?! @@ -75,7 +75,7 @@ function f(arg1, ...rest, arg2) { // arg2 بعد از ...rest ?! ## متغیر "arguments" -همچنین یک آبجکت آرایه مانند ویژه به نام `arguments` وجود دارد که شامل همه آرگومان ها بر اساس ترتیب فهرست آنها است. +همچنین یک شی آرایه مانند ویژه به نام `arguments` وجود دارد که شامل همه آرگومان‌ها بر اساس ترتیب فهرست آنها است. برای مثال: @@ -96,16 +96,16 @@ showName("پیام", "مرادی"); showName("ایلیا"); ``` -در زمان های قدیم، ویژگی پارامترهای اضافی در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌های تابع بود. و هنوز کار می کند، می توانیم آن را در کدهای قدیمی پیدا کنیم. +در زمان های قدیم، ویژگی پارامتر‌های رست در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌‌های تابع بود. و هنوز کار می‌کند، می‌توانیم آن را در کد‌های قدیمی پیدا کنیم. -اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار ، اما یک آرایه نیست. از متد‌های آرایه پشتیبانی نمی کند ، بنابراین نمی توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. +اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. -همچنین همیشه شامل همه آرگومان‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌های اضافی کردیم. +همچنین همیشه شامل همه آرگومان‌‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌‌های رست انجام دادیم. -بنابراین وقتی به این ویژگی ها نیاز داریم، پارامترهای اضافی ترجیح داده می شود. +بنابراین وقتی به این ویژگی‌ها نیاز داریم، پارامتر‌های رست ترجیح داده می‌شود. -````smart header="توابع تک خطی آبجکت `\"arguments\"` ندارند" -اگر از یک تابع تک خطی به آبجکت `arguments` دسترسی پیدا کنیم ، آنها را از تابع "عادی" بیرونی خارج می کند. +````smart header="توابع تک خطی شی `\"arguments\"` ندارند" +اگر از یک تابع تک خطی به شی `arguments` دسترسی پیدا کنیم، آنها را از تابع "عادی" بیرونی خارج می‌کند. در اینجا یک مثال وجود دارد: @@ -118,16 +118,15 @@ function f() { f(1); // 1 ``` -همانطور که به خاطر داریم ، توابع تک خطی از خود `this` ندارند. اکنون می دانیم که آنها آبجکت `arguments` خاصی نیز ندارند. +همانطور که به خاطر داریم، توابع تک خطی از خود `this` ندارند. اکنون می‌دانیم که آنها شی `arguments` خاصی نیز ندارند. +## سینتکس اسپرد [#spread-syntax] -## سینتکس گسترش [#spread-syntax] - -ما فقط نحوه گرفتن یک آرایه از لیست پارامترها را دیدیم. +ما فقط نحوه گرفتن یک آرایه از لیست پارامتر‌ها را دیدیم. اما گاهی اوقات ما باید دقیقاً برعکس عمل کنیم. -برای مثال ، یک تابع داخلی [Math.max](mdn: js/Math/max) وجود دارد که بیشترین عدد را از یک لیست بر می گرداند: +برای مثال، یک تابع داخلی [Math.max](mdn: js/Math/max) وجود دارد که بیشترین عدد را از یک لیست بر می‌گرداند: ```js run alert( Math.max(3, 5, 1) ); // 5 @@ -135,7 +134,7 @@ alert( Math.max(3, 5, 1) ); // 5 حالا فرض کنید یک آرایه داریم `[3, 5, 1]`. چگونه با آن تابع `Math.max` را فراخوانی کنیم؟ -وارد کردن آن "همانطور که هست" کار نخواهد کرد ، زیرا `Math.max` لیستی از آرگومان های عددی را انتظار دارد ، نه یک آرایه واحد: +وارد کردن آن "همانطور که هست" کار نخواهد کرد، زیرا `Math.max` لیستی از آرگومان های عددی را انتظار دارد، نه یک آرایه واحد: ```js run let arr = [3, 5, 1]; @@ -145,18 +144,18 @@ alert( Math.max(arr) ); // NaN */!* ``` -و مطمئناً ما نمی توانیم مواردی را در تابع `Math.max (arr [0] ، arr [1] ، arr [2])` به صورت دستی لیست کنیم ، زیرا ممکن است مطمئن نباشیم تعداد آنها چقدر است. همانطور که اسکریپت ما اجرا می شود ، ممکن است تعداد زیادی (آرگومان) وجود داشته باشد ، یا ممکن است وجود نداشته باشد. و این باعث زشتی کد ما می شود. +و مطمئناً ما نمی‌توانیم مواردی را در تابع `Math.max (arr [0], arr [1], arr [2])` به صورت دستی لیست کنیم، زیرا ممکن است مطمئن نباشیم تعداد آنها چقدر است. همانطور که اسکریپت ما اجرا می‌شود، ممکن است تعداد زیادی (آرگومان) وجود داشته باشد، یا ممکن است وجود نداشته باشد. و این باعث زشتی کد ما می‌شود. -*سینتکس گسترش* برای نجات! شبیه به پارامتر های اضافی به نظر می‌رسد، همچنین از `...` استفاده می‌کند، اما کاملا متفاوت است. +*سینتکس اسپرد* برای نجات! شبیه به پارامتر‌های رست به نظر می‌رسد، همچنین از `...` استفاده می‌کند، اما کاملا متفاوت است. -هنگامی که از `...arr` در فراخوانی تابع استفاده میشود، یک آبجکت `arr` قابل تکرار را در لیست آرگومان ها قرار میدهد. +هنگامی که از `...arr` در فراخوانی تابع استفاده می‌شود، یک شی `arr` قابل تکرار را در لیست آرگومان‌ها قرار می‌دهد. برای `Math.max`: ```js run let arr = [3, 5, 1]; -alert( Math.max(...arr) ); // 5 (سینتکس گسترش یک آرایه را به لیستی از آرگومان ها تبدیل می‌کند) +alert( Math.max(...arr) ); // 5 (سینتکس اسپرد یک آرایه را به لیستی از آرگومان‌ها تبدیل می‌کند) ``` همچنین می‌توان چند مورد قابل تکرار را از این طریق به عنوان آرگومان به تابع انتقال داد: @@ -168,7 +167,7 @@ let arr2 = [8, 3, -8, 1]; alert( Math.max(...arr1, ...arr2) ); // 8 ``` -حتی میتوان سینتکس گسترش را با مقادیر معمولی ترکیب کرد: +حتی می‌توان سینتکس اسپرد را با مقادیر معمولی ترکیب کرد: ```js run @@ -178,7 +177,7 @@ let arr2 = [8, 3, -8, 1]; alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25 ``` -همچنین سینتکس گسترش می‌تواند برای ادغام آرایه ها استفاده شود: +همچنین سینتکس اسپرد می‌تواند برای ادغام آرایه‌ها استفاده شود: ```js run let arr = [3, 5, 1]; @@ -191,9 +190,9 @@ let merged = [0, ...arr, 2, ...arr2]; alert(merged); // 0,3,5,1,2,8,9,15 (0, سپس arr, سپس 2, سپس arr2) ``` -در مثال های بالا ما از آرایه برای نشان دادن سینتکس گسترش استفاده کردیم، اما برای هر مورد قابل تکرار قابل استفاده است +در مثال‌های بالا ما از آرایه برای نشان دادن سینتکس اسپرد استفاده کردیم، اما برای هر مورد قابل تکرار قابل استفاده است -برای مثال، در اینجا از سینتکس گسترش برای تبدیل رشته به آرایه ای از کاراکتر ها استفاده میکنیم: +برای مثال، در اینجا از سینتکس اسپرد برای تبدیل رشته به آرایه ای از کاراکتر‌ها استفاده می‌کنیم: ```js run let str = "سلام"; @@ -201,11 +200,11 @@ let str = "سلام"; alert( [...str] ); // س، ل، ا، م ``` -نحو گسترش به صورت داخلی از تکرارکنندگان برای جمع آوری المنت‌ها استفاده می کند ، همانطور که `for..of` این کار را انجام میدهد. +سینتکس اسپرد به صورت داخلی از تکرارکنندگان برای جمع آوری المنت‌‌ها استفاده می‌کند، همانطور که `for..of` این کار را انجام می‌دهد. -بنابراین ، برای یک رشته ، `for..of` کاراکترها را برمی گرداند و با استفاده از` ... str` به "H" ، "e" ، "l" ، "l" ، "o" ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه "[... str]" منتقل می شود. +بنابراین، برای یک رشته، `for..of` کاراکتر‌ها را برمی‌گرداند و با استفاده از` ... str` به "س"، "ل"، "ا"، "م" ` تبدیل می‌شود. لیست کاراکتر‌ها به تنظیم کننده آرایه "[... str]" منتقل می‌شود. -برای این کار خاص همچنین می توانیم از `Array.from` استفاده کنیم ، زیرا یک تکرار شونده (مانند یک رشته) را به یک آرایه تبدیل می کند: +برای این کار خاص همچنین می‌توانیم از `Array.from` استفاده کنیم، زیرا یک تکرار شونده (مانند یک رشته) را به یک آرایه تبدیل می‌کند: ```js run let str = "Hello"; @@ -219,29 +218,29 @@ alert( Array.from(str) ); // س، ل، ا، م اما بین "Array.from (obj)" و "[... obj]" یک تفاوت ظریف وجود دارد: - `Array.from` هم بر روی "آرایه مانند" و هم بر روی "تکرار شونده" کار می‌کند. -- سینتکس گسترش فقط بر روی "تکرار شونده ها" کار می‌کند. +- سینتکس اسپرد فقط بر روی "تکرار شونده‌ها" کار می‌کند. -بنابراین ، برای تبدیل چیزی به یک آرایه ، Array.from بیشتر جهانی است. +بنابراین، برای تبدیل چیزی به یک آرایه، Array.from بیشتر جهانی است. -## کپی کردن یک آرایه/آبجکت +## کپی کردن یک آرایه/شی زمانی که ما در مورد `Object.assign()` [در گذشته صحبت کردیم را به یاد دارید](info:object-copy#cloning-and-merging-object-assign)? -انجام همان کار با سینتکس گسترش امکان پذیز است. +انجام همان کار با سینتکس اسپرد امکان پذیر است. ```js run let arr = [1, 2, 3]; *!* -let arrCopy = [...arr]; // یک آرایه را به لیستی از پارامتر ها گسترش می‌دهد +let arrCopy = [...arr]; // یک آرایه را به لیستی از پارامتر‌ها گسترش می‌دهد // سپس نتیجه را در یک آرایه جدید قرار می‌دهد */!* -// آیا آریه ها محتوای یکسانی دارند؟ +// آیا آریه‌ها محتوای یکسانی دارند؟ alert(JSON.stringify(arr) === JSON.stringify(arrCopy)); // true -// آیا آرایه ها برابر هستند؟ +// آیا آرایه‌ها برابر هستند؟ alert(arr === arrCopy); // false (مرجع یکسان نیست) // اصلاح آرایه اولیه باعث ایجاد تغییر در کپی نمی‌شود: @@ -250,45 +249,45 @@ alert(arr); // 1, 2, 3, 4 alert(arrCopy); // 1, 2, 3 ``` -توجه داشته باشید که برای ایجاد یک کپی از یک آبجکت می توان همان کار را انجام داد: +توجه داشته باشید که برای ایجاد یک کپی از یک شی می‌توان همان کار را انجام داد: ```js run let obj = { a: 1, b: 2, c: 3 }; *!* -let objCopy = { ...obj }; // آبجکت را به لیستی از پارامتر ها گسترش می‌دهد - // سپس نتیجه را در یک آبجکت جدید برمی‌گرداند +let objCopy = { ...obj }; // شی را به لیستی از پارامتر‌ها گسترش می‌دهد + // سپس نتیجه را در یک شی جدید برمی‌گرداند */!* -// آیا آبجکت ها محتوای یکسانی دارند؟ +// آیا شی‌ها محتوای یکسانی دارند؟ alert(JSON.stringify(obj) === JSON.stringify(objCopy)); // true -// آیا آبجکت ها برابر هستند؟ +// آیا شی‌ها برابر هستند؟ alert(obj === objCopy); // false (مرجع یکسان نیست) -// اصلاح آبجکت اولیه باعث تغییر در ایجاد تغییر در آبجکت کپی نمی‌شود: +// اصلاح شی اولیه باعث ایجاد تغییر در شی کپی‌شده نمی‌شود: obj.d = 4; alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -این روش کپی کردن یک آبجکت بسیار کوتاه‌تر از `let objCopy = Object.assign ({}، obj )` و یا برای یک آرایه `arrCopy = Object.assign ([]، arr )` است ، بنابراین ما ترجیح می دهیم هر زمان که میتوانیم از آن استفاده کنیم. +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign ({}، obj )` و یا برای یک آرایه `arrCopy = Object.assign ([]، arr )` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه -هنگامی که در کد `" ... "` را می‌بینیم، این عبارت یا پارامتر های اضافی است یا سینتکس گسترش. +هنگامی که در کد `" ... "` را می‌بینیم، این عبارت یا پارامتر‌های رست است یا سینتکس اسپرد. یک راه آسان برای تشخیص تمایز بین آنها وجود دارد: -- وقتی `...` در انتهای پارامترهای تابع قرار دارد ، "پارامترهای اضافی" است و بقیه لیست آرگومان ها را در یک آرایه جمع آوری می کند. -- وقتی `...` در فراخوانی یک تابع یا در موقعیت مانند آن نوشته می‌شود ، آن را" سینتکس گسترش "می نامند و یک آرایه را به یک لیست گسترش می دهد. +- وقتی `...` در انتهای پارامتر‌های تابع قرار دارد، "پارامتر‌های رست" است و بقیه لیست آرگومان‌ها را در یک آرایه جمع آوری می‌کند. +- وقتی `...` در فراخوانی یک تابع یا در موقعیت مانند آن نوشته می‌شود، آن را" سینتکس اسپرد "می‌نامند و یک آرایه را به یک لیست گسترش می‌دهد. -از الگو ها استفاده کنید: +از الگو‌ها استفاده کنید: -- پارامتر‌های اضافی برای ایجاد توابعی که هر تعداد آرگومان را بپذیرند استفاده می شوند. -- سینتکس گسترش برای انتقال یک آرایه به توابعی که معمولاً به لیست آرگومان های زیادی نیاز دارند ، استفاده می شود. +- پارامتر‌‌های رست برای ایجاد توابعی که هر تعداد آرگومان را بپذیرند استفاده می‌شوند. +- سینتکس اسپرد برای انتقال یک آرایه به توابعی که معمولاً به لیستی از آرگومان‌ها نیاز دارند، استفاده می‌شود. -آنها با هم کمک می‌کنند به جابه‌جایی آسان بین یک لیست و یک آرایه از پارامتر‌ها +آنها با هم کمک می‌کنند به جابه‌جایی آسان بین یک لیست و یک آرایه از پارامتر‌‌ها. -تمام آرگومان های یک فراخوانی تابع نیز در "سبک قدیمی" `arguments`: آبجکت آرایه مانند قابل تکرار موجود است +تمام آرگومان های یک فراخوانی تابع نیز در "سبک قدیمی" `arguments`: شی آرایه مانند قابل تکرار، موجود است. From 7043ee1ddd3607ca5331106713bffa6be5db4800 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Wed, 1 Sep 2021 20:59:25 +0430 Subject: [PATCH 12/24] Problems solved --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 1 + 1 file changed, 1 insertion(+) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index af2b6f19b..c1d7bf3a0 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -119,6 +119,7 @@ f(1); // 1 ``` همانطور که به خاطر داریم، توابع تک خطی از خود `this` ندارند. اکنون می‌دانیم که آنها شی `arguments` خاصی نیز ندارند. +```` ## سینتکس اسپرد [#spread-syntax] From fd76e66c6e90fc95b6289ce6f3c95e197c814c28 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Wed, 1 Sep 2021 21:28:00 +0430 Subject: [PATCH 13/24] Some problems resolved --- .../02-rest-parameters-spread/article.md | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index c1d7bf3a0..a36f3ea32 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -1,4 +1,4 @@ -# پارامتر‌های رست و سینتکس اسپرد +# پارامترهای رست و سینتکس اسپرد بسیاری از توابع جاوا‌اسکریپت از تعداد دلخواه آرگومان‌‌ها پشتیبانی می‌کنند. @@ -25,7 +25,7 @@ alert( sum(1, 2, 3, 4, 5) ); به دلیل آرگومان‌های بیش از اندازه هیچ خطایی وجود نخواهد داشت. البته در نتیجه فقط دو مورد اول محاسبه خواهند شد. -بقیه پارامتر‌ها را می‌توان با استفاده از سه نقطه `...` در قسمت تعریف تابع گنجاند و به دنبال آن نام آرایه ای که آنها را شامل است نوشت. نقاط به صورت تحت الفظی به معنی "جمع آوری پارامتر‌های باقی مانده (رست) در یک آرایه" است. +بقیه پارامترها را می‌توان با استفاده از سه نقطه `...` در قسمت تعریف تابع گنجاند و به دنبال آن نام آرایه ای که آنها را شامل است نوشت. نقاط به صورت تحت الفظی به معنی "جمع آوری پارامترهای باقی مانده (رست) در یک آرایه" است. برای مثال، برای جمع آوری تمام آرگومان‌ها در آرایه `args`: @@ -43,7 +43,7 @@ alert( sumAll(1, 2) ); // 3 alert( sumAll(1, 2, 3) ); // 6 ``` -ما می‌توانیم اولین پارامتر‌ها را به عنوان متغیر دریافت کنیم و بقیه را جمع آوری کنیم. +ما می‌توانیم اولین پارامترها را به عنوان متغیر دریافت کنیم و بقیه را جمع آوری کنیم. در اینجا دو آرگومان اول به متغیر و بقیه به آرایه `title` تبدیل می‌شوند: @@ -61,8 +61,8 @@ function showName(firstName, lastName, ...titles) { showName("پیام", "مرادی", "مشاور", "امپراطور"); ``` -````warn header="پارامتر‌های رست باید در انتها باشند" -پارامتر‌های رست همه آرگومان‌های باقی مانده را جمع آوری می‌کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: +````warn header="پارامترهای رست باید در انتها باشند" +پارامترهای رست همه آرگومان‌های باقی مانده را جمع آوری می‌کنند، بنابراین موارد زیر منطقی نیستند و باعث ایجاد خطا می‌شوند: ```js function f(arg1, ...rest, arg2) { // arg2 بعد از ...rest ?! @@ -96,13 +96,13 @@ showName("پیام", "مرادی"); showName("ایلیا"); ``` -در زمان های قدیم، ویژگی پارامتر‌های رست در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌‌های تابع بود. و هنوز کار می‌کند، می‌توانیم آن را در کد‌های قدیمی پیدا کنیم. +در زمان های قدیم، ویژگی پارامترهای رست در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌‌های تابع بود. و هنوز کار می‌کند، می‌توانیم آن را در کد‌های قدیمی پیدا کنیم. اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. همچنین همیشه شامل همه آرگومان‌‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌‌های رست انجام دادیم. -بنابراین وقتی به این ویژگی‌ها نیاز داریم، پارامتر‌های رست ترجیح داده می‌شود. +بنابراین وقتی به این ویژگی‌ها نیاز داریم، پارامترهای رست ترجیح داده می‌شود. ````smart header="توابع تک خطی شی `\"arguments\"` ندارند" اگر از یک تابع تک خطی به شی `arguments` دسترسی پیدا کنیم، آنها را از تابع "عادی" بیرونی خارج می‌کند. @@ -119,11 +119,12 @@ f(1); // 1 ``` همانطور که به خاطر داریم، توابع تک خطی از خود `this` ندارند. اکنون می‌دانیم که آنها شی `arguments` خاصی نیز ندارند. + ```` ## سینتکس اسپرد [#spread-syntax] -ما فقط نحوه گرفتن یک آرایه از لیست پارامتر‌ها را دیدیم. +ما فقط نحوه گرفتن یک آرایه از لیست پارامترها را دیدیم. اما گاهی اوقات ما باید دقیقاً برعکس عمل کنیم. @@ -147,7 +148,7 @@ alert( Math.max(arr) ); // NaN و مطمئناً ما نمی‌توانیم مواردی را در تابع `Math.max (arr [0], arr [1], arr [2])` به صورت دستی لیست کنیم، زیرا ممکن است مطمئن نباشیم تعداد آنها چقدر است. همانطور که اسکریپت ما اجرا می‌شود، ممکن است تعداد زیادی (آرگومان) وجود داشته باشد، یا ممکن است وجود نداشته باشد. و این باعث زشتی کد ما می‌شود. -*سینتکس اسپرد* برای نجات! شبیه به پارامتر‌های رست به نظر می‌رسد، همچنین از `...` استفاده می‌کند، اما کاملا متفاوت است. +*سینتکس اسپرد* برای نجات! شبیه به پارامترهای رست به نظر می‌رسد، همچنین از `...` استفاده می‌کند، اما کاملا متفاوت است. هنگامی که از `...arr` در فراخوانی تابع استفاده می‌شود، یک شی `arr` قابل تکرار را در لیست آرگومان‌ها قرار می‌دهد. @@ -234,7 +235,7 @@ alert( Array.from(str) ); // س، ل، ا، م let arr = [1, 2, 3]; *!* -let arrCopy = [...arr]; // یک آرایه را به لیستی از پارامتر‌ها گسترش می‌دهد +let arrCopy = [...arr]; // یک آرایه را به لیستی از پارامترها گسترش می‌دهد // سپس نتیجه را در یک آرایه جدید قرار می‌دهد */!* @@ -256,7 +257,7 @@ alert(arrCopy); // 1, 2, 3 let obj = { a: 1, b: 2, c: 3 }; *!* -let objCopy = { ...obj }; // شی را به لیستی از پارامتر‌ها گسترش می‌دهد +let objCopy = { ...obj }; // شی را به لیستی از پارامترها گسترش می‌دهد // سپس نتیجه را در یک شی جدید برمی‌گرداند */!* @@ -277,11 +278,11 @@ alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ## خلاصه -هنگامی که در کد `" ... "` را می‌بینیم، این عبارت یا پارامتر‌های رست است یا سینتکس اسپرد. +هنگامی که در کد `" ... "` را می‌بینیم، این عبارت یا پارامترهای رست است یا سینتکس اسپرد. یک راه آسان برای تشخیص تمایز بین آنها وجود دارد: -- وقتی `...` در انتهای پارامتر‌های تابع قرار دارد، "پارامتر‌های رست" است و بقیه لیست آرگومان‌ها را در یک آرایه جمع آوری می‌کند. +- وقتی `...` در انتهای پارامترهای تابع قرار دارد، "پارامترهای رست" است و بقیه لیست آرگومان‌ها را در یک آرایه جمع آوری می‌کند. - وقتی `...` در فراخوانی یک تابع یا در موقعیت مانند آن نوشته می‌شود، آن را" سینتکس اسپرد "می‌نامند و یک آرایه را به یک لیست گسترش می‌دهد. از الگو‌ها استفاده کنید: From 31f6fedec1f050235670ff1bd393160095f0fd13 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 10:37:45 +0430 Subject: [PATCH 14/24] All problems solved --- .../02-rest-parameters-spread/article.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index a36f3ea32..6ec380ff8 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -10,7 +10,7 @@ در این فصل با نحوه انجام این کار آشنا می‌شویم. و همچنین نحوه انتقال آرایه به توابع به عنوان پارامتر(ها) را یاد خواهیم گرفت. -## پارامتر‌‌های رست `...` +## پارامترهای رست `...` یک تابع را می‌توان با هر تعداد آرگومان، صرف نظر از نحوه تعریف آن، فراخوانی کرد. @@ -100,7 +100,7 @@ showName("ایلیا"); اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. -همچنین همیشه شامل همه آرگومان‌‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌‌های رست انجام دادیم. +همچنین همیشه شامل همه آرگومان‌‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌های رست انجام دادیم. بنابراین وقتی به این ویژگی‌ها نیاز داریم، پارامترهای رست ترجیح داده می‌شود. @@ -194,7 +194,7 @@ alert(merged); // 0,3,5,1,2,8,9,15 (0, سپس arr, سپس 2, سپس arr2) در مثال‌های بالا ما از آرایه برای نشان دادن سینتکس اسپرد استفاده کردیم، اما برای هر مورد قابل تکرار قابل استفاده است -برای مثال، در اینجا از سینتکس اسپرد برای تبدیل رشته به آرایه ای از کاراکتر‌ها استفاده می‌کنیم: +برای مثال، در اینجا از سینتکس اسپرد برای تبدیل رشته به آرایه ای از کاراکترها استفاده می‌کنیم: ```js run let str = "سلام"; @@ -204,7 +204,7 @@ alert( [...str] ); // س، ل، ا، م سینتکس اسپرد به صورت داخلی از تکرارکنندگان برای جمع آوری المنت‌‌ها استفاده می‌کند، همانطور که `for..of` این کار را انجام می‌دهد. -بنابراین، برای یک رشته، `for..of` کاراکتر‌ها را برمی‌گرداند و با استفاده از` ... str` به "س"، "ل"، "ا"، "م" ` تبدیل می‌شود. لیست کاراکتر‌ها به تنظیم کننده آرایه "[... str]" منتقل می‌شود. +بنابراین، برای یک رشته، `for..of` کاراکترها را برمی‌گرداند و با استفاده از` ... str` به "س"، "ل"، "ا"، "م" ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه "[... str]" منتقل می‌شود. برای این کار خاص همچنین می‌توانیم از `Array.from` استفاده کنیم، زیرا یک تکرار شونده (مانند یک رشته) را به یک آرایه تبدیل می‌کند: @@ -287,9 +287,9 @@ alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} از الگو‌ها استفاده کنید: -- پارامتر‌‌های رست برای ایجاد توابعی که هر تعداد آرگومان را بپذیرند استفاده می‌شوند. +- پارامترهای رست برای ایجاد توابعی که هر تعداد آرگومان را بپذیرند استفاده می‌شوند. - سینتکس اسپرد برای انتقال یک آرایه به توابعی که معمولاً به لیستی از آرگومان‌ها نیاز دارند، استفاده می‌شود. -آنها با هم کمک می‌کنند به جابه‌جایی آسان بین یک لیست و یک آرایه از پارامتر‌‌ها. +آنها با هم کمک می‌کنند به جابه‌جایی آسان بین یک لیست و یک آرایه از پارامترها. تمام آرگومان های یک فراخوانی تابع نیز در "سبک قدیمی" `arguments`: شی آرایه مانند قابل تکرار، موجود است. From 1ee2e384942d05361cd33401f1958a37d709094f Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 10:44:40 +0430 Subject: [PATCH 15/24] Fixed line 122 --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 6ec380ff8..f5a4db146 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -119,7 +119,6 @@ f(1); // 1 ``` همانطور که به خاطر داریم، توابع تک خطی از خود `this` ندارند. اکنون می‌دانیم که آنها شی `arguments` خاصی نیز ندارند. - ```` ## سینتکس اسپرد [#spread-syntax] From 43d6a3fcf3269452a702ef1e0c7ec047b9a969c8 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 10:51:21 +0430 Subject: [PATCH 16/24] Some problems solved --- .../02-rest-parameters-spread/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index f5a4db146..1e89a8aaf 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -272,12 +272,12 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign ({}، obj )` و یا برای یک آرایه `arrCopy = Object.assign ([]، arr )` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign ({}، obj )` و یا برای یک آرایه `arrCopy = Object.assign([]، arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه -هنگامی که در کد `" ... "` را می‌بینیم، این عبارت یا پارامترهای رست است یا سینتکس اسپرد. +هنگامی که در کد `" ..."` را می‌بینیم، این عبارت یا پارامترهای رست است یا سینتکس اسپرد. یک راه آسان برای تشخیص تمایز بین آنها وجود دارد: From db608e9bc106400e500300b3bbb2b0c848c88243 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 10:52:07 +0430 Subject: [PATCH 17/24] Some problems sovled --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 1e89a8aaf..13dc5a59c 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -277,7 +277,7 @@ alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ## خلاصه -هنگامی که در کد `" ..."` را می‌بینیم، این عبارت یا پارامترهای رست است یا سینتکس اسپرد. +هنگامی که در کد `"..."` را می‌بینیم، این عبارت یا پارامترهای رست است یا سینتکس اسپرد. یک راه آسان برای تشخیص تمایز بین آنها وجود دارد: From 25180f1ca589a7bdd44823115f19ee4cb77ae5e6 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 13:21:04 +0430 Subject: [PATCH 18/24] new line added --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 1 + 1 file changed, 1 insertion(+) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 13dc5a59c..b9ee80bb3 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -121,6 +121,7 @@ f(1); // 1 همانطور که به خاطر داریم، توابع تک خطی از خود `this` ندارند. اکنون می‌دانیم که آنها شی `arguments` خاصی نیز ندارند. ```` + ## سینتکس اسپرد [#spread-syntax] ما فقط نحوه گرفتن یک آرایه از لیست پارامترها را دیدیم. From c1195f046377c8e994d4c188439163a93255505d Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 13:53:19 +0430 Subject: [PATCH 19/24] Issues solved --- .../02-rest-parameters-spread/article.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index b9ee80bb3..7b214aa17 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -92,7 +92,7 @@ function showName() { // نشان می‌دهد: 2, پیام, مرادی showName("پیام", "مرادی"); -// نشان می‌دهد: 1, ایلیا, تعریف نشده (undefined) (آرگومان دوم وجود ندارد) +// نشان می‌دهد: 1, ایلیا, undefined (آرگومان دوم وجود ندارد) showName("ایلیا"); ``` @@ -128,7 +128,7 @@ f(1); // 1 اما گاهی اوقات ما باید دقیقاً برعکس عمل کنیم. -برای مثال، یک تابع داخلی [Math.max](mdn: js/Math/max) وجود دارد که بیشترین عدد را از یک لیست بر می‌گرداند: +برای مثال، یک تابع داخلی [Math.max](mdn:js/Math/max) وجود دارد که بیشترین عدد را از یک لیست بر می‌گرداند: ```js run alert( Math.max(3, 5, 1) ); // 5 @@ -146,7 +146,7 @@ alert( Math.max(arr) ); // NaN */!* ``` -و مطمئناً ما نمی‌توانیم مواردی را در تابع `Math.max (arr [0], arr [1], arr [2])` به صورت دستی لیست کنیم، زیرا ممکن است مطمئن نباشیم تعداد آنها چقدر است. همانطور که اسکریپت ما اجرا می‌شود، ممکن است تعداد زیادی (آرگومان) وجود داشته باشد، یا ممکن است وجود نداشته باشد. و این باعث زشتی کد ما می‌شود. +و مطمئناً ما نمی‌توانیم مواردی را در تابع `Math.max(arr[0], arr[1], arr[2])` به صورت دستی لیست کنیم، زیرا ممکن است مطمئن نباشیم تعداد آنها چقدر است. همانطور که اسکریپت ما اجرا می‌شود، ممکن است تعداد زیادی (آرگومان) وجود داشته باشد، یا ممکن است وجود نداشته باشد. و این باعث زشتی کد ما می‌شود. *سینتکس اسپرد* برای نجات! شبیه به پارامترهای رست به نظر می‌رسد، همچنین از `...` استفاده می‌کند، اما کاملا متفاوت است. @@ -217,12 +217,12 @@ alert( Array.from(str) ); // س، ل، ا، م نتیجه مانند نتیجه هنگام استفاده از `[...str]` است. -اما بین "Array.from (obj)" و "[... obj]" یک تفاوت ظریف وجود دارد: +اما بین `Array.from(obj)` و `[...obj]` یک تفاوت ظریف وجود دارد: - `Array.from` هم بر روی "آرایه مانند" و هم بر روی "تکرار شونده" کار می‌کند. - سینتکس اسپرد فقط بر روی "تکرار شونده‌ها" کار می‌کند. -بنابراین، برای تبدیل چیزی به یک آرایه، Array.from بیشتر جهانی است. +بنابراین، برای تبدیل چیزی به یک آرایه، `Array.from` بیشتر جهانی است. ## کپی کردن یک آرایه/شی @@ -273,7 +273,7 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign ({}، obj )` و یا برای یک آرایه `arrCopy = Object.assign([]، arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign ({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([]، arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه From cad24d70f8ca76bfccb48a04bf2b5f36ae5d38f1 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 14:24:58 +0430 Subject: [PATCH 20/24] Some issues resolved --- .../02-rest-parameters-spread/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 7b214aa17..7be68cc36 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -98,7 +98,7 @@ showName("ایلیا"); در زمان های قدیم، ویژگی پارامترهای رست در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌‌های تابع بود. و هنوز کار می‌کند، می‌توانیم آن را در کد‌های قدیمی پیدا کنیم. -اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map (...)` را فراخوانی کنیم. +اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map(...)` را فراخوانی کنیم. همچنین همیشه شامل همه آرگومان‌‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌های رست انجام دادیم. @@ -204,7 +204,7 @@ alert( [...str] ); // س، ل، ا، م سینتکس اسپرد به صورت داخلی از تکرارکنندگان برای جمع آوری المنت‌‌ها استفاده می‌کند، همانطور که `for..of` این کار را انجام می‌دهد. -بنابراین، برای یک رشته، `for..of` کاراکترها را برمی‌گرداند و با استفاده از` ... str` به "س"، "ل"، "ا"، "م" ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه "[... str]" منتقل می‌شود. +بنابراین، برای یک رشته، `for..of` کاراکترها را برمی‌گرداند و با استفاده از `...str` به "س"، "ل"، "ا"، "م ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه "[...str]" منتقل می‌شود. برای این کار خاص همچنین می‌توانیم از `Array.from` استفاده کنیم، زیرا یک تکرار شونده (مانند یک رشته) را به یک آرایه تبدیل می‌کند: @@ -272,8 +272,8 @@ obj.d = 4; alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` - -این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign ({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([]، arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. + +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه From b92e4581c0bb62bed724ffe310a9fead8a8a825c Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 14:32:54 +0430 Subject: [PATCH 21/24] Fixed --- .../02-rest-parameters-spread/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 7be68cc36..6b918f878 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -98,7 +98,7 @@ showName("ایلیا"); در زمان های قدیم، ویژگی پارامترهای رست در زبان جاوااسکریپت وجود نداشت و استفاده از "arguments" تنها راه بدست آوردن همه آرگومان‌‌های تابع بود. و هنوز کار می‌کند، می‌توانیم آن را در کد‌های قدیمی پیدا کنیم. -اما نکته منفی این است که اگرچه "arguments" هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map(...)` را فراخوانی کنیم. +اما نکته منفی این است که اگرچه `arguments` هم آرایه مانند است و هم قابل تکرار، اما یک آرایه نیست. از متد‌‌های آرایه پشتیبانی نمی‌کند، بنابراین نمی‌توانیم به عنوان مثال `arguments.map(...)` را فراخوانی کنیم. همچنین همیشه شامل همه آرگومان‌‌ها است. ما نمی‌توانیم تعداد مشخصی از آنها را به دست بیاوریم، مانند کاری که با پارامتر‌های رست انجام دادیم. @@ -199,12 +199,12 @@ alert(merged); // 0,3,5,1,2,8,9,15 (0, سپس arr, سپس 2, سپس arr2) ```js run let str = "سلام"; -alert( [...str] ); // س، ل، ا، م +alert( [...str] ); // س, ل, ا, م ``` سینتکس اسپرد به صورت داخلی از تکرارکنندگان برای جمع آوری المنت‌‌ها استفاده می‌کند، همانطور که `for..of` این کار را انجام می‌دهد. -بنابراین، برای یک رشته، `for..of` کاراکترها را برمی‌گرداند و با استفاده از `...str` به "س"، "ل"، "ا"، "م ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه "[...str]" منتقل می‌شود. +بنابراین، برای یک رشته، `for..of` کاراکترها را برمی‌گرداند و با استفاده از `...str` به "س"، "ل"، "ا"، "م ` تبدیل می‌شود. لیست کاراکترها به تنظیم کننده آرایه `[...str]` منتقل می‌شود. برای این کار خاص همچنین می‌توانیم از `Array.from` استفاده کنیم، زیرا یک تکرار شونده (مانند یک رشته) را به یک آرایه تبدیل می‌کند: @@ -212,7 +212,7 @@ alert( [...str] ); // س، ل، ا، م let str = "Hello"; // Array.from یک قابل تکرار را به آرایه تبدیل می‌کند -alert( Array.from(str) ); // س، ل، ا، م +alert( Array.from(str) ); // س, ل, ا, م ``` نتیجه مانند نتیجه هنگام استفاده از `[...str]` است. @@ -272,7 +272,7 @@ obj.d = 4; alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` - + این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. From 33aa375a3596e280b1069ad5c5a6b65888d5cbfa Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 14:39:11 +0430 Subject: [PATCH 22/24] Fixed --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 6b918f878..b3fa923aa 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -273,7 +273,7 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `let arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه From 59ab60aa6dc080e033d5000ad105e0ff04fa8bc2 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 14:48:35 +0430 Subject: [PATCH 23/24] Fixed --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index b3fa923aa..6b918f878 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -273,7 +273,7 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `let arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه From 6b6172209a51134122b4112bab44ff37d3b426b6 Mon Sep 17 00:00:00 2001 From: Amirhossein Veysi Date: Thu, 2 Sep 2021 14:51:28 +0430 Subject: [PATCH 24/24] All issues fixed --- 1-js/06-advanced-functions/02-rest-parameters-spread/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 6b918f878..b3fa923aa 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -273,7 +273,7 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. +این روش کپی کردن یک شی بسیار کوتاه‌تر از `let objCopy = Object.assign({}, obj)` و یا برای یک آرایه `let arrCopy = Object.assign([], arr)` است، بنابراین ما ترجیح می‌دهیم هر زمان که می‌توانیم از آن استفاده کنیم. ## خلاصه