164 lines
6.0 KiB
Markdown
164 lines
6.0 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)
|
||
|
||
### 代码说明:
|
||
|
||
* 首先,我们创建一个函数,唯一的目的是检查一个数字是否真的是一个数字,如果不是,我们返回undefined。使用**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)
|
||
|
||
### 代码说明:
|
||
|
||
* 首先,我们迭代参数并验证它们是数字,如果它们不是,我们返回undefined。
|
||
* 然后我们检查参数数量是否大于1,如果我们使用`Array.prototype.reduce`添加参数
|
||
* 否则,如果我们不返回undefined,则返回一个函数,该函数检查接收的参数是否为数字并添加它。
|
||
|
||
> **注意:**如果您已在文章中添加了**相关内容** ,请仅添加您的用户名。 (请不要删除任何现有名称。) |