jQuery测试套件未通过

时间:2019-05-18 10:29:29

标签: javascript jquery ramda.js

我是jquery和函数式编程的初学者 我将jquery函数转换为函数编程范例,以下是原始的jquery函数

   merge: function( first, second ) {
            var len = +second.length,
                j = 0,
                i = first.length;

            for ( ; j < len; j++ ) {
                first[ i++ ] = second[ j ];
            }

            first.length = i;

            return first;
        },

我像

 merge: function( first, second ) {
            var len = +second.length,
                j = 0,
                i = first.length;

            let main = (first,second)=>
            {return R.concat(first, second);}
            first.length = i;

        return main(first,second)
        },

但是Jquery测试套件没有通过。
它只是通过了测试编号5 (就绪:就绪回调中的错误不会停止所有将来的执行(gh-1823)(1))
并且没有通过测试6。
我认为我的代码有一些副作用。但我猜不到。 有没有人可以找到它?

2 个答案:

答案 0 :(得分:0)

在其他问题上the answer显示了如何更简单地编写此函数,并且尽管我们没有足够的信息来知道您的测试套件为什么失败(下一次包括失败的测试) ,我们可以看看您的功能。重新格式化,这是

const merge = function( first, second ) {
    var len = +second.length,
        j = 0,
        i = first.length;

    let main = (first,second) => {
        return R.concat(first, second);
    }
    first.length = i;

    return main(first,second)
}

现在让我们简化一下。您的退货单为return main(first, second)。并且main函数完全不依赖于lenji,并将first.length重置为刚从{{ 1}}什么也不做。因此,编写起来就像

first.length

但是现在请注意,您的辅助函数在其闭包中除了外部函数的参数外什么都没有,并且它们被其自己的参数遮盖了。这意味着您可以完全消除它,而只需使用它的主体即可。

所以我们进入

const merge = function( first, second ) {
    let main = (first,second) => {
        return R.concat(first, second);
    }

    return main(first,second)
}

最后,格式为const merge = function( first, second ) { return R.concat(first, second); } 的函数除了重命名function(p1, p2, ..., pn) {return anotherFunc(p1, p2, ..., pn);}之外没有做其他事情。

所以最后,您可以只写

anotherFunc

我不知道为什么您的函数需要做更多的工作,但这都是不必要的。我看不到有什么会导致测试套件失败,因为您确实编写了仍然可以正常工作的函数,并且没有明显的副作用,但是也许测试系统实际上跟踪了长度的变化其参数。那将是不寻常的,但肯定是可能的。

答案 1 :(得分:0)

我看不到您的代码中可能导致该错误的任何内容。 jQuery中与that test case相关的代码应该完全无关。

也就是说,这两个函数之间的区别之一是jQuery mergesecond的元素插入到first数组实例的末尾。 R.concat将参数视为不可变的,返回一个包含firstsecond所有元素的新数组,而原始firstsecond数组则保持不变。 n.b.如果依赖jQuery函数中数组的就地修改,这将在行为上产生差异。

顺便提一下,您的第二个示例也可以像这样简化:

merge: function( first, second ) {
  return R.concat(first, second);
}

或更简单地说:

merge: R.concat