JavaScript面试测试失败
我最近通过了一次JavaScript面试测试,在一些答案上没有得到雇主的反馈,特别是一个问题。测试是用Mocha测试设置的,您必须编写代码才能通过。测试是:JavaScript面试测试失败,javascript,function,Javascript,Function,我最近通过了一次JavaScript面试测试,在一些答案上没有得到雇主的反馈,特别是一个问题。测试是用Mocha测试设置的,您必须编写代码才能通过。测试是: describe('Step 5', function() { it('add(2,8)(5).value() => 15', function() { add(2,8)(5).value() .should.be.exactly(15).and.be.a.Number; }); it('add(3
describe('Step 5', function() {
it('add(2,8)(5).value() => 15', function() {
add(2,8)(5).value()
.should.be.exactly(15).and.be.a.Number;
});
it('add(3, 3, 5)(4)(3, 2).value() => 20', function() {
add(3, 3, 5)(4)(3, 2).value()
.should.be.exactly(20).and.be.a.Number;
});
});
有人能帮你回答这个问题,并解释一下你可能如何/为什么以及何时使用它吗?我认为问题的“棘手”部分与方法调用中的()
链接有关<代码>添加(2,8)(5)与添加(2,8,5)
不同。对于第一次调用(因此,在练习中),您的add
方法应该返回一个函数,而不是加法的结果
请参阅此处的更多信息:在本作业中,希望您了解函数的部分应用。假设您有一个具有两个参数的函数:
> function plus(a, b) { return a + b }
> plus(1,5)
6
现在,如果你用更少的参数来调用它会发生什么
> plus(1)
NaN
这并不是特别有用——Javascript只是将默认的undefined
用于第二个参数,函数中断。一个更聪明的处理方法是“冻结”第一个参数,当第二个参数出现时,对两个参数执行操作。然后,加上(1)(5)
将返回6。为此,我们重写plus
,使其返回另一个已包含第一个参数的函数,并接受第二个参数:
> function plus(a) { return function(b) { return a + b } }
> plus(1)(5)
6
这种“冻结”函数参数的过程称为“部分应用程序”。使用较少参数调用时自动执行此操作的函数是“curried”函数。在javascript中,它们没有被广泛使用,但大多数函数式语言都支持它们
你的作业的实际解决方案稍微复杂一些,我把它留作练习(看看是否有帮助)
将函数fn
传递到curry
以创建一个函数,该函数在被调用时创建一个函数,该函数将随时间累积传递给它的参数,并返回自身。通过调用从curry
返回的函数所附带的value
方法,可以将累积参数应用于fn
在这种情况下,您可以创建一个add函数,该函数可添加任意数量的参数,并使其接收累积的参数
就我个人而言,我从来没有机会使用这种技术。但显然,这是一个很好的面试问题,至于“如何、为什么和何时”可能会被录用。这就是所谓的“讨好”。谢谢你的帮助!
describe('Step 5', function() {
var curry = function (fn) {
return function () {
var args = [],
accumulate = function accumulate() {
args = args.concat(Array.prototype.slice.call(arguments));
return accumulate;
};
accumulate.value = function () {
return fn.apply(null, args);
};
accumulate.apply(null, arguments);
return accumulate;
};
},
add = curry(function () {
return Array.prototype.reduce.call(arguments, function (total, number) {
return total + number;
}, 0);
});
it('add(2,8)(5).value() => 15', function() {
add(2,8)(5).value()
.should.be.exactly(15).and.be.a.Number;
});
it('add(3, 3, 5)(4)(3, 2).value() => 20', function() {
add(3, 3, 5)(4)(3, 2).value()
.should.be.exactly(20).and.be.a.Number;
});
});