javascript - 如何理解“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 的值.但是从这个问题及其实现代码来看,我可能对这个问题有误解。那么,这个问题的真正含义是什么?面试官经常会问这个问题。
解决方案
这归结为 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 == [])
--> 真
推荐阅读
- flutter - 新项目上的颤振崩溃
- php - 无法将数据存储到 laravel 用户模型中
- python - 用于查找图形函数的交点的 Python 脚本
- e2e-testing - 页面初始化前如何在TestCafe中设置本地存储
- python - 如何在不改变轴比例的情况下将线函数(x =)插入虹膜数据立方体图?
- ethereum - 我已经使用 truffle unbox react 并且我无法在solidity中返回或添加值到数组
- python - 以 Finviz 之类的格式转换具有 >100 列的数据框
- html - 使用按钮在表格中滚动表格
- c - 使用 taylor put sin(1) 的 C 程序并得到 0.841
- reactjs - 如何在 CoreUI/React 中创建范围滑块?