首页 > 解决方案 > 如何理解“add(1)(2)(3)=6”?

问题描述

我正在学习 javascript 中的咖喱函数。我想到了一个问题。

// how to implement the add function in the below.

add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;

我已经知道实现的代码

function add() {
var _args = Array.prototype.slice.call(arguments);
var _adder = function () {
    _args.push(...arguments);
    return _adder;
};
_adder.toString = function () {
    return _args.reduce(function (a, b) {
        return a + b;
    });
}
return _adder;
}
console.log(add(1)(2)(3)(4)(5))    // function 
console.log(add(1)(2)(3))          // function
console.log(add(1, 2, 3)(4))       // function

console.log(add(1)(2)(3)(4)(5) == 15)  // true 
console.log(add(1)(2)(3) == 6)         // true
console.log(add(1, 2, 3)(4) == 10)     // true

console.log(add(1)(2)(3)(4)(5) === 15)  // false
console.log(add(1)(2)(3) === 6)         // false
console.log(add(1, 2, 3)(4) === 10)     // false

我知道实现的代码是如何工作的。但我对这个问题很好奇。在我看来,“add(1)(2)(3) = 6;”意味着在执行表达式“add(1)(2)(3)”之后,它应该返回一个完全等于数字 6 的值.但是从这个问题及其实现代码来看,我可能对这个问题有误解。那么,这个问题的真正含义是什么?面试官经常会问这个问题。

标签: javascriptfunctiontostringcurrying

解决方案


这归结为 JavaScript 运算符。

=做任务。

===进行正常的相等比较。函数永远不等于数字。

==对这两个值进行麻烦的类型转换,然后进行相等测试。通常最好避免它。在这种情况下,这些类型转换可以将您的柯里化函数转换为字符串,toString如果其复杂的规则使其将第一个 arg 强制转换为字符串,该字符串运行您的柯里化函数,并将另一个参数转换为字符串,则该方法可能会调用您的方法, 并且两个字符串相等。

这种自动转换和希望最好的测试很容易做错事。例子:

  • console.log(add(10)(-10) == '')--> 真
  • console.log(add(10)(20) == 30)--> 真
  • console.log(add(10)(20) == ' 30 ')--> 真
  • console.log(add(10)(20) == 036)--> 真
  • console.log(add(10)(20) == ' 036 ')--> 假的
  • console.log(add(10)(20) == ' 36 ')--> 假的
  • console.log(add(2)(-2) == [])-> 假的
  • console.log(0 == [])--> 真

另请参阅https://stackoverflow.com/a/359509/1682419


推荐阅读