检查谓词的返回类型

时间:2016-07-31 18:33:22

标签: javascript



Array.prototype.takeWhile = function (predicate) {
    'use strict';
    var $self = this
    if (typeof predicate === 'function') {
        let flagged = false, matching_count = 0, nomatching_count = 0;
        for (let i = 0; i < $self.length; i++) {
            let e = $self[i]
            if (predicate(e)) {
                if (!nomatching_count) {
                    matching_count++
                } else {
                    flagged = true
                    break
                }
            } else {
                nomatching_count++
            }
        }
        return !flagged ? $self.slice(0, matching_count) : $self
    }
    throw new TypeError('predicate must be a function')
};

var test = function () {
  var array = [1, 2, 3, 4, 5];
  alert(array.takeWhile(x => x <= 3))
};
&#13;
<button onclick="test()">Click me</button>
&#13;
&#13;
&#13;

条件之后:

if (typeof predicate === 'function') {

}

我想问一下:如何检查predicate的返回类型?

我想阻止这种情况:

var array = [1, 2, 3, 4, 5];
alert(array.takeWhile(function () {}));

1 个答案:

答案 0 :(得分:3)

Javascript函数可以返回任何内容,因此无法预测或推断其返回类型。确定返回内容类型的唯一方法是运行该函数并检查结果的类型。

var result = predicate(e);
if (typeof result === 'undefined') {
    throw 'Invalid predicate'
}

请注意,函数的返回类型可以是undefined,这是一个空函数将返回的内容。

然而,这似乎是不必要的,因为内置数组方法没有检查这种边缘情况。例如[1,2,3].filter(function() {}); Array.filter()方法返回一个空数组,因为提供的函数(谓词)永远不会对数组中的任何项返回true。

console.log( [1,2,3].filter(function() {}) );