我正在学习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运算符。
=
进行分配。
===
进行普通的相等比较。函数从不等于数字。
==
对两个值进行麻烦的类型转换,然后进行相等性测试。通常最好避免这种情况。在这种情况下,这些类型转换可以将您的curried函数转换为字符串,如果其复杂的规则使其将第一个arg强制转换为字符串,则可以调用您的toString
方法,该字符串将运行您的curried函数,并转换另一个参数到一个字符串,并且两个字符串相等。
这种自动转换并希望获得最佳测试很容易做错事。示例:
console.log(add(10)(-10) == '')
-> trueconsole.log(add(10)(20) == 30)
-> trueconsole.log(add(10)(20) == ' 30 ')
-> trueconsole.log(add(10)(20) == 036)
-> trueconsole.log(add(10)(20) == ' 036 ')
->假console.log(add(10)(20) == ' 36 ')
->假console.log(add(2)(-2) == [])
-> falseconsole.log(0 == [])
-> true