212 lines
13 KiB
Markdown
212 lines
13 KiB
Markdown
![]() |
---
|
|||
|
title: Arguments Optional
|
|||
|
localeTitle: الحجج اختياري
|
|||
|
---
|
|||
|

|
|||
|
|
|||
|
 تذكر استخدام **`Read-Search-Ask`** إذا واجهتك مشكلة. حاول إقران البرنامج  واكتب الكود الخاص بك 
|
|||
|
|
|||
|
##  شرح المشكلة:
|
|||
|
|
|||
|
يمكن أن يكون الأمر معقدًا جدًا لفهم ما يجب فعله. هناك دائمًا العديد من الطرق لفعل شيء ما عند الترميز ولكن بغض النظر عن الخوارزمية المستخدمة ، يجب علينا إنشاء برنامج يقوم بما يلي:
|
|||
|
|
|||
|
* لديه لإضافة رقمين تمريرها كمعلمات وإرجاع المبلغ.
|
|||
|
* لديها لمعرفة ما اذا كان أي من الأرقام هي الأرقام الفعلية، وإلا العودة **غير محدد** ووقف البرنامج هناك.
|
|||
|
* عليها أن تتحقق مما إذا كان لديها وسيطة واحدة أو اثنتين تم تمريرهما. أكثر يتم تجاهلها.
|
|||
|
* إذا كان يحتوي على وسيطة واحدة فقط ، فيجب عليه إرجاع دالة تستخدم هذا الرقم وتتوقع دالة أخرى ، ثم إضافتها.
|
|||
|
|
|||
|
### روابط ذات صلة
|
|||
|
|
|||
|
* [المصفوفات](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)
|
|||
|
* [نوع من](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)
|
|||
|
* [كائن الحجج](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
|
|||
|
|
|||
|
##  تلميح: 1
|
|||
|
|
|||
|
في كل مرة تتعامل فيها مع حجة ، عليك أن تتحقق مما إذا كانت رقمًا أم لا. لهذه الوظيفة التي تعالج هذه المهمة سيوفر لك رمز المتكررة.
|
|||
|
|
|||
|
> _حاول أن تحل المشكلة الآن_
|
|||
|
|
|||
|
##  تلميح: 2
|
|||
|
|
|||
|
عند العمل على الحالة التي يحتاج فيها إلى إرجاع الدالة ، فمن الحكمة أن تتحقق مما إذا كانت الحجة الأولى والوحيدة رقمًا مرة أخرى وتربط الشفرة في ذلك.
|
|||
|
|
|||
|
> _حاول أن تحل المشكلة الآن_
|
|||
|
|
|||
|
##  تلميح: 3
|
|||
|
|
|||
|
في حالة تمرير وسيطة واحدة فقط ، لا تقلق بشأن كيفية تحريك الإدخال للوسيط الثاني ، فقط قم بتعيين تعريف الوظيفة بشكل صحيح وستعمل الأشياء على النحو الذي ينبغي عليه.
|
|||
|
|
|||
|
> _حاول أن تحل المشكلة الآن_
|
|||
|
|
|||
|
## تنبيه المفسد!
|
|||
|
|
|||
|

|
|||
|
|
|||
|
**الحل في المستقبل!**
|
|||
|
|
|||
|
##  الحل الأساسي للكود:
|
|||
|
|
|||
|
` function addTogether() {
|
|||
|
// Function to check if a number is actually a number
|
|||
|
// and return undefined otherwise.
|
|||
|
var checkNum = function(num) {
|
|||
|
if (typeof num !== 'number') {
|
|||
|
return undefined;
|
|||
|
} else
|
|||
|
return num;
|
|||
|
};
|
|||
|
|
|||
|
// Check if we have two parameters, check if they are numbers
|
|||
|
// handle the case where one is not
|
|||
|
// returns the addition.
|
|||
|
if (arguments.length > 1) {
|
|||
|
var a = checkNum(arguments[0]);
|
|||
|
var b = checkNum(arguments[1]);
|
|||
|
if (a === undefined || b === undefined) {
|
|||
|
return undefined;
|
|||
|
} else {
|
|||
|
return a + b;
|
|||
|
}
|
|||
|
} else {
|
|||
|
// If only one parameter was found, returns a new function that expects two
|
|||
|
// Store first argument before entering the new function scope
|
|||
|
var c = arguments[0];
|
|||
|
|
|||
|
// Check the number again, must be outside the function to about returning an object
|
|||
|
// instead of undefined.
|
|||
|
if (checkNum(c)) {
|
|||
|
// Return function that expect a second argument.
|
|||
|
return function(arg2) {
|
|||
|
// Check for non-numbers
|
|||
|
if (c === undefined || checkNum(arg2) === undefined) {
|
|||
|
return undefined;
|
|||
|
} else {
|
|||
|
// if numbers then add them.
|
|||
|
return c + arg2;
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// test here
|
|||
|
addTogether(2,3);
|
|||
|
`
|
|||
|
|
|||
|
 [تشغيل الكود](https://repl.it/CLnz/0)
|
|||
|
|
|||
|
### شرح الشفرة:
|
|||
|
|
|||
|
* أولاً ، أقوم بإنشاء دالة لغرض وحيد هو التحقق مما إذا كان الرقم في الواقع رقمًا وإرجاع غير معروف إذا لم يكن. ويستخدم **typeof** للتحقق.
|
|||
|
* تحقق مما إذا كان لدينا **معلمتان** ، إذا كان الأمر كذلك ، فتحقق مما إذا كانت أرقامًا أو لا تستخدم الدالة **checkNum التي** قمت بإنشائها.
|
|||
|
* إذا لم تكن **غير محددة ، فأضفها** وأعد الإضافة. إذا كان أي منهم غير محدد ثم إرجاع غير محدد.
|
|||
|
* في حالة وجود وسيطة واحدة فقط ، فإننا نعيد دالة جديدة تتوقع معلمتين. ولهذا نقوم بتخزين الحجة الأولى قبل الدخول في نطاق جديد لتجنب استبدال حججنا.
|
|||
|
* لا نزال داخل الجزء الأكبر الآخر ، نحتاج إلى التحقق من الحجة التي قمنا بحفظها ، إذا كان الرقم رقمًا ، فسنعيد الدالة التي تتوقع حجة ثانية.
|
|||
|
* الآن داخل الدالة التي نعود إليها ، علينا التحقق من الأرقام غير مرة أخرى كما في البداية باستخدام **checkNum** إذا لم يتم **تحديدها** ثم إرجاعها ، وإلا إذا **أضافتها** الأرقام وأعد الإضافة.
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* [نوع من](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)
|
|||
|
* [كائن الحجج](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
|
|||
|
|
|||
|
##  حل الشفرة المتوسطة:
|
|||
|
|
|||
|
` function addTogether() {
|
|||
|
var args = new Array(arguments.length);
|
|||
|
//Storing the arguments in an array
|
|||
|
for(var i = 0; i < args.length; ++i) {
|
|||
|
args[i] = arguments[i];
|
|||
|
}
|
|||
|
//Check for the arguments length
|
|||
|
if(args.length == 2){
|
|||
|
//If there are two arguments,check for the type of both arguments
|
|||
|
//Use typeof to check the type of the argument(both should be numbers)
|
|||
|
if(typeof args[0] !== 'number' || typeof args[1] !=='number' ){
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
return args[0]+args[1];
|
|||
|
}
|
|||
|
//When only one argument is provided
|
|||
|
if(args.length == 1){
|
|||
|
a= args[0];
|
|||
|
//Check the argument using typeof
|
|||
|
if(typeof a!=='number'){
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
else{
|
|||
|
//Making use of closures
|
|||
|
return function(b){
|
|||
|
//Checking the second argument
|
|||
|
if(typeof b !=='number'){
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
else
|
|||
|
return a+b;
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// test here
|
|||
|
addTogether(2,3);
|
|||
|
`
|
|||
|
|
|||
|
 [تشغيل الكود](https://repl.it/CLoA/0)
|
|||
|
|
|||
|
### شرح الشفرة:
|
|||
|
|
|||
|
* أولاً تخزين الوسائط في صفيف عن طريق إنشاء صفيف باستخدام أسلوب منشئ.
|
|||
|
* يضيف كل وسيطة إلى الصفيف الجديد.
|
|||
|
* ثم تحقق من طول الصفيف الجديد حيث نحتاج إلى معرفة ما إذا كان لدينا ما يكفي أو لا.
|
|||
|
* تحقق من نوع الوسيطات باستخدام `typeof` حيث يجب أن يكون كلاهما أرقامًا.
|
|||
|
* لا يتم إرجاع الإعادة إذا كان أي منها ليس رقماً ، أو إرجاع مجموعها إذا كانت كذلك.
|
|||
|
* إذا لم يكن هناك سوى وسيطة واحدة ، ما زلنا نتحقق من النوع بعد تخزينه في متغير جديد وإرجاع دالة جديدة أو غير محددة.
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* [نوع من](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)
|
|||
|
* [كائن الحجج](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
|
|||
|
|
|||
|
##  الحل المتقدم للكود:
|
|||
|
|
|||
|
` //jshint esversion: 6
|
|||
|
function addTogether() {
|
|||
|
var args = Array.from(arguments);
|
|||
|
return args.some(n => typeof n !== 'number') ?
|
|||
|
undefined:
|
|||
|
args.length > 1 ?
|
|||
|
args.reduce((acc, n) => acc += n, 0):
|
|||
|
(n) => typeof n === "number" ?
|
|||
|
n + args[0]:
|
|||
|
undefined;
|
|||
|
}
|
|||
|
|
|||
|
// test here
|
|||
|
addTogether(2,3);
|
|||
|
`
|
|||
|
|
|||
|
 [تشغيل الكود](https://repl.it/CLoB/0)
|
|||
|
|
|||
|
### شرح الشفرة:
|
|||
|
|
|||
|
* أولا أنا من خلال تكرار الحجج والتحقق من الحجج التي ليست عددا وترجع غير محددة
|
|||
|
* إذا لم يكن الأمر كذلك فأنا أتأكد مما إذا كان طول الوسيطات أعلى من 1 ، إذا كنت أجمع الحجج باستخدام Array.prototype.reduce
|
|||
|
* أقوم بإرجاع دالة تتحقق مما إذا كانت الوسيطة التي تم تمريرها عبارة عن رقم وجمعها ، إذا لم يتم إرجاعها
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* [Array.prototype.reduce](http://forum.freecodecamp.com/t/javascript-array-prototype-reduce/14299)
|
|||
|
* [Array.prototype.some](http://forum.freecodecamp.com/t/javascript-array-prototype-some/14304)
|
|||
|
* [Array.from](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from)
|
|||
|
|
|||
|
> **ملاحظة:** الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة أي **محتويات رئيسية ذات صلة** إلى صفحة wiki. (الرجاء عدم إزالة أي أسماء مستخدمين حالية.)
|
|||
|
|
|||
|
##  ملاحظات للمساهمات:
|
|||
|
|
|||
|
*  **لا تقم** بإضافة حلول مشابهة لأي حلول موجودة. إذا كنت تعتقد أنها **_مشابهة ولكن أفضل_** ، فحاول دمج (أو استبدال) الحل المشابه الموجود.
|
|||
|
* أضف شرحًا لحلك.
|
|||
|
* تصنيف الحل في واحدة من الفئات التالية - **الأساسي** **والمتوسط** **والمتقدم** . 
|
|||
|
* الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة أي **محتويات رئيسية ذات صلة** . (  **_لا_** _تزيل أي أسماء مستخدمين حالية_ )
|
|||
|
|
|||
|
> نرى  [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) كمرجع.
|