参数 可选 - 为什么我得到参数 (2)([3]) 的字符串?

Arguments Optional - why do I get a string for arguments (2)([3])?

这是对我在 Freecodecamp 中关于参数可选挑战的问题的跟进(见下文 0:

我现在已经满足了挑战的 5/6 条件,除了当输入是 addTogether(2,([3])) 时,returns '23' 作为字符串而不是正确的'undefined'.

如果 [3] 是一个数组,而数组是 object,我的 checkNum 函数不应该将其标记为未定义吗?字符串是在哪里生成的?

我现在的代码:

function addTogether() {
  function checkNum(x) {
    return typeof x === 'number' ? x : undefined;
  }

  let num1 = checkNum(arguments[0]);
  let num2 = checkNum(arguments[1]);

  if (arguments.length === 1) {
    if (typeof num1 === 'number') {
      let a = num1;
      return function (b) {
        return a + b;
      };
    }
    return undefined;
  }

  if (arguments.length > 1) {
    if (typeof num1 !== 'number' || typeof num2 !== 'number') {
      return undefined;
    }
    if (typeof num1 === 'number' && typeof num2 === 'number');
    {
      return arguments[0] + arguments[1];
    }
  }
}

谢谢

//原题如下:

我被 freecodecamp 问题困住了 Arguments 可选。 https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/arguments-optional 在研究这个问题时,已经多次提到以下 code-block,但我无法理解它的含义:

if(arguments.length==1){
      if (typeof a == "number"){
        return function(b){
          if (typeof b == "number"){
            return a + b;
          }
        };
      }
    }

我理解到'return function(b)'部分,然后我的大脑就融化了。

如果有人可以向 6-year-old 解释一下,这个新手将非常感谢您的帮助。

我们可以用两种方式声明函数,常规方式:

function test(){
}

或者有趣的方式

let test = function(){

}

在这种情况下,函数是 returning 一个函数 看这里:

function returnfunction(){
 return function(b){
          if (typeof b == "number"){
            return a + b;
          }
        }
}
let x = returnfunction()

所以,x是returnfunction的return值,也就是

function(b){
          if (typeof b == "number"){
            return a + b;
          }
}

和上面很相似,

x = function(){
//...
}

这是 return 函数而不是值的常见做法。

当使用一个参数调用外部函数(应该做加法)时,它不是做加法(不能做),而是 returning 一个函数。当随后使用数字参数调用该函数时,它会执行函数 b 并求和。

假设外部函数名称是add(),那么它可以通过以下方式触发:

add(10, 15); // 25
var f = add(20);
f(18) // 38
add(4)(6) // 10

完整示例:

function add(a, b) {
    if (arguments.length == 1) {
        if (typeof a == "number") {
            return function (b) {
                if (typeof b == "number") {
                    return a + b;
                }
            };
        } else {
            return "undefined";
        }
    } else if (arguments.length == 2) {
        if (typeof a == "number" && typeof b == "number") {
            return a + b;
        } else {
            return "undefined";
        }
    } else {
        return "undefined";
    }
}

console.log(add(10, 15));
var f = add(20);
console.log(f(18));
console.log(add("xyz"));
console.log(add(10, "5"));
console.log(add(4)(6));