JavaScript面试测试失败

时间:2015-02-25 08:44:06

标签: 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, 3, 5)(4)(3, 2).value() => 20', function() {
    add(3, 3, 5)(4)(3, 2).value()
      .should.be.exactly(20).and.be.a.Number;
  });
});

有人可以帮助解答并解释如何/为何以及可能何时使用此答案?

3 个答案:

答案 0 :(得分:4)

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;
  });
});

将函数fn传递给curry以创建一个函数,该函数在调用时创建一个函数,该函数累积随时间传递给它的参数,并返回自身。您可以通过调用从fn返回的函数返回的函数附加的value方法将累积的参数应用于curry

在这种情况下,您可以创建一个add函数,该函数可以累加任意数量的参数,并且可以接收累积的参数。

我个人从未有机会使用这种技术。但显然这是一个很好的面试问题,因此对于"如何,为什么以及何时:"可能会被录用。

答案 1 :(得分:3)

在此作业中,您需要了解部分应用程序的功能。假设您有一个带有两个参数的函数:

> function plus(a, b) { return a + b }
> plus(1,5)
6

现在,如果用较少的参数调用它会发生什么?

> plus(1)
NaN

这并不是特别有用 - Javascript只是使用默认的undefined作为第二个参数,并且函数会中断。一个更聪明的方法就是"冻结"第一个参数,当第二个参数出现时,对两者执行操作。然后,plus(1)(5)将返回6.为此,我们重写plus,以便它返回另一个已包含第一个参数并接受第二个参数的函数:

> function plus(a) { return function(b) { return a + b } }
> plus(1)(5)
6

这个"冷冻"函数参数被称为"部分应用程序"。使用较少参数调用时自动执行此操作的函数是" curried"功能。在javascript中,它们没有被广泛使用,但是大多数函数式语言都支持它们。

您的作业的实际解决方案稍微复杂一些,我将其作为练习(请参阅this answer是否有帮助)。

答案 2 :(得分:1)

我认为"棘手"问题的一部分与方法调用中()的链接有关。 add(2, 8)(5)add(2, 8, 5)不同。对于第一次调用(因此,在您的练习中),您的add方法应该返回一个函数,而不是添加的结果。

在此处查看更多内容:Function calling in Javascript with double brackets