如何理解“ add(1)(2)(3)= 6”?

问题描述 投票:0回答:1

我正在学习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的值但是,从这个问题及其实现代码来看,我可能对这个问题有误解。所以,这个问题的真正含义是什么?面试官经常问这个问题。

javascript function tostring currying
1个回答
0
投票

这取决于JavaScript运算符。

=进行分配。

===进行普通的相等比较。函数从不等于数字。

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

这种自动转换并希望获得最佳测试很容易做错事。示例:

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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.