164 lines
8.8 KiB
Markdown
164 lines
8.8 KiB
Markdown
---
|
||
title: Algoritmo De Argumentos Opcionales
|
||
localeTitle: Алгоритм опционных аргументов
|
||
---
|
||
![](//discourse-user-assets.s3.amazonaws.com/original/2X/f/ff2fd8ffa014eea28587a8ef4933340d3dcc4b09.jpg)
|
||
|
||
### объяснение:
|
||
|
||
Может быть немного сложно понять, что нужно делать. Когда мы программируем, есть разные способы сделать что-то. Независимо от используемого алгоритма нам необходимо создать функцию, которая выполняет следующие действия:
|
||
|
||
* Вы должны добавить два числа, полученные в качестве параметров, и вернуть результат.
|
||
* Вы должны проверить, что оба числа действительно являются числами, иначе возвратите **undefined** и остановите функцию в то время.
|
||
* Вы должны проверить, что полученные аргументы - один или два. Если их больше, их следует игнорировать.
|
||
* Если получен только один аргумент, должна быть возвращена функция, которая принимает другой аргумент, а затем добавление.
|
||
|
||
## Подсказка: 1
|
||
|
||
Каждый раз, когда вы работаете с аргументом, вы должны проверить, действительно ли это число или нет. Чтобы избежать повторения кода, вы должны создать функцию, которая занимается этой задачей.
|
||
|
||
## Подсказка: 2
|
||
|
||
Когда необходимо вернуть функцию, рекомендуется проверить, является ли первый и единственный аргумент новым номером и основывает на нем код.
|
||
|
||
## Подсказка: 3
|
||
|
||
В случае, когда принимается только один аргумент, не беспокойтесь о том, как запросить второй, просто выполните определение функции правильно, и все будет работать так, как должно.
|
||
|
||
## Спойлер!
|
||
|
||
![предупреждающий знак](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
|
||
|
||
**Решение ниже!**
|
||
|
||
## Решение для кода:
|
||
```
|
||
function addTogether() {
|
||
// Función para comprobar si un número es realmente un número
|
||
// y retornar undefined en caso contrario.
|
||
var checkNum = function(num) {
|
||
if (typeof num !== 'number') {
|
||
return undefined;
|
||
} else
|
||
return num;
|
||
};
|
||
|
||
// Comprobar si tenemos dos parámetros y si ambos son números
|
||
// En caso que no lo sean retornamos undefined
|
||
// retornamos la suma
|
||
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 {
|
||
// Si solo es encontrado un parámetro retornamos una nueva función para solicitar un segundo parámetro
|
||
// Guardamos el primer argumento antes de entrar al scope de la nueva función
|
||
var c = arguments[0];
|
||
|
||
// Comprobamos que sea número de nuevo, debe ser fuera del objeto que retornaremos
|
||
// en lugar de undefined.
|
||
if (checkNum(c)) {
|
||
// // Retornamos la función que espera el segundo parámetro.
|
||
return function(arg2) {
|
||
// Comprobamos que no sean números.
|
||
if (c === undefined || checkNum(arg2) === undefined) {
|
||
return undefined;
|
||
} else {
|
||
// Si lo son, sumamos.
|
||
return c + arg2;
|
||
}
|
||
};
|
||
}
|
||
}
|
||
}
|
||
|
||
// realizamos el test
|
||
addTogether(2,3);
|
||
```
|
||
|
||
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": ракета:") [В REPL!](https://repl.it/CLnz/0)
|
||
|
||
### Объяснение кода:
|
||
|
||
* Сначала мы создаем функцию с единственной целью проверить, действительно ли число действительно является числом, и мы возвращаем неопределенное, если это не так. Используйте **typeof** для проверки.
|
||
* Мы проверяем, есть ли у нас два параметра, если у нас есть, мы проверяем, являются ли они числами или не используют функцию **checkNum** .
|
||
* Если параметры не **определены,** мы добавляем их и возвращаем сумму. Если один из них не определен, мы возвращаем undefined.
|
||
* Если у нас есть только один аргумент, мы возвращаем новую функцию, которая ожидает два параметра. Для этого мы сохраняем второй параметр перед входом в функцию, чтобы избежать перезаписи аргумента.
|
||
* Даже в первом случае _нам_ нужно проверить, что сохраненный аргумент - это число, если оно есть, то мы возвращаем функцию, ожидающую второго аргумента.
|
||
* Теперь внутри возвращаемой функции мы должны проверить, что новый параметр является числом с помощью **checkNum** , если он не определен, мы вернем его, и в противном случае мы добавим числа и вернем результат.
|
||
|
||
## Второе решение:
|
||
```
|
||
function addTogether() {
|
||
var args = new Array(arguments.length);
|
||
// Almacenamos los argumentos en un array.
|
||
for(var i = 0; i < args.length; ++i) {
|
||
args[i] = arguments[i];
|
||
}
|
||
// Comprobamos la cantidad de argumentos.
|
||
if(args.length == 2){
|
||
// Si hay dos argumentos, comprobamos el tipo de ambos
|
||
// Utiliza typeof para comprobar el tipo de argumentos. (ambos deben ser números)
|
||
if(typeof args[0] !== 'number' || typeof args[1] !=='number' ){
|
||
return undefined;
|
||
}
|
||
return args[0]+args[1];
|
||
}
|
||
// Cuando solo un argumento es provisto.
|
||
if(args.length == 1){
|
||
a = args[0];
|
||
// Comprobamos el tipo utilizando typeof.
|
||
if(typeof a!=='number'){
|
||
return undefined;
|
||
}
|
||
else{
|
||
// Hacemos uso de las funciones internas.
|
||
return function(b){
|
||
// Comprobamos el segundo parámetro.
|
||
if(typeof b !=='number'){
|
||
return undefined;
|
||
}
|
||
else
|
||
return a+b;
|
||
};
|
||
}
|
||
}
|
||
}
|
||
|
||
// realizamos el test
|
||
addTogether(2,3);
|
||
```
|
||
|
||
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": ракета:") [В REPL!](https://repl.it/CLoA/0)
|
||
|
||
## Третье решение:
|
||
```
|
||
//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;
|
||
}
|
||
|
||
// realizamos el test
|
||
addTogether(2,3);
|
||
```
|
||
|
||
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": ракета:") [В REPL!](https://repl.it/CLoB/0)
|
||
|
||
### Объяснение кода:
|
||
|
||
* Сначала мы перебираем аргументы и проверяем, что они являются числами, и если они не возвращаются, мы не возвращаем неопределенные.
|
||
* Затем мы проверяем, что количество аргументов больше 1, если мы добавляем аргументы, используя `Array.prototype.reduce`
|
||
* В противном случае мы возвращаем функцию, которая проверяет, что полученный параметр является числом и добавляет его, если мы не возвращаем неопределенные.
|
||
|
||
> **ПРИМЕЧАНИЕ.** Пожалуйста, добавьте свое имя пользователя, только если вы добавили в статью **соответствующий контент** . (Пожалуйста, не удаляйте существующее имя.) |