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;
条件之后:
if (typeof predicate === 'function') {
}
我想问一下:如何检查predicate
的返回类型?
我想阻止这种情况:
var array = [1, 2, 3, 4, 5];
alert(array.takeWhile(function () {}));
答案 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() {}) );