检查函数是否总是返回布尔值

时间:2018-02-19 12:39:36

标签: javascript predicate

我需要检查用户指定的谓词是否总是返回一个布尔值。示例代码如下所示:

sudo chown -R "${USER:-$(id -un)}" .

哪个有效。 let isMostlyBoolean = function (aPredicate) { return ( typeof aPredicate(undefined) === 'boolean' && typeof aPredicate(null) === 'boolean' && typeof aPredicate(false) === 'boolean' && typeof aPredicate(Number.NaN) === 'boolean' && typeof aPredicate(256) === 'boolean' && typeof aPredicate("text") === 'boolean' && typeof aPredicate('s') === 'boolean' && typeof aPredicate(Math.sqrt) === 'boolean' && typeof aPredicate(Object) === 'boolean' && typeof aPredicate(['x', 'y', 'z']) === 'boolean' ); } 检查有更简洁和/或更有效的方法吗?在这里,我们逐个扫描所有可能的data types

正如_.isFunction(a) vs. typeof a === 'function'? javascript讨论中所述,aPredicate应该是要走的路。知道如何以更加花哨和可读的方式做到这一点吗?

  

编辑:注意上面的测试是一种模糊逻辑。功能名称已相应更改。请参阅下面的@georg评论等。

鉴于测试代码:

typeof

控制台输出是:

let prediLess = (x) => x<2;
let predicate = (x) => x || (x<2);

console.log("isMostlyBoolean(prediLess): ", isMostlyBoolean(prediLess));
console.log("isMostlyBoolean(predicate): ", isMostlyBoolean(predicate));

console.log("\nprediLess(undefined): ", prediLess(undefined));
console.log("prediLess(1): ", prediLess(1));
console.log("prediLess(Object): ", prediLess(Object));

console.log("\npredicate(undefined): ", predicate(undefined));
console.log("predicate(1): ", predicate(1));
console.log("predicate(Object): ", predicate(Object));

1 个答案:

答案 0 :(得分:5)

 [undefined, null, NaN, 0, 1, "", "a", [], [1], {}].every(el => typeof aPredicate(el) === "boolean");

只需将所有可能的值存储在数组中并迭代它并检查每个值是否合适。