我正在编写一个函数,它接受一个参数并返回一个真值。
我最初的想法只是return !!value,但对于'0'、{}或[]来说,这将失败。我知道'0'应该是真的,但在我的应用程序中,我们认为它是错误的。
因此,我的函数应该返回false:
false、0、undefined、null、''{},[]'0'因此,考虑到这一点,我更新了下面的代码来处理
var isTrue = function(value) {
switch (typeof(value)) {
case "string":
return !(value === '0' || value === 'false');
case "number":
case "boolean":
return !!value;
case "object":
return Object.keys(value).length > 0
}
}
console.log(false,isTrue(false))
console.log(true,isTrue(true))
console.log(0,isTrue(0))
console.log(1,isTrue(1))
console.log('0',isTrue('0'))
console.log('1',isTrue('1'))
console.log('test',isTrue('test'))
console.log('Object',isTrue({}))
console.log('Array',isTrue([]))现在这个很好用。它不包括对functions的处理,但这不在当前问题的范围之内。我的问题是,有没有更好的方法来处理同样的问题?
发布于 2016-10-27 23:17:03
我想这样会更快:
!!value来评价价值“标准”真理。'false',在您的问题中没有引用,但在您的代码中)这样,它还可以减少代码,如下所示:
var isTrue = function(value) {
return (!!value && value !== '0' && value !== 'false'
&& !!(typeof value !== 'object' || Object.keys(value).length));
}
console.log(false,isTrue(false));
console.log("'false'",isTrue('false'));
console.log(true,isTrue(true));
console.log(0,isTrue(0));
console.log(1,isTrue(1));
console.log("'0'",isTrue('0'));
console.log("'1'",isTrue('1'));
console.log("'test'",isTrue('test'));
console.log('{}',isTrue({}));
console.log('[]',isTrue([]));
console.log('Object',isTrue({a: 1}));
console.log('Array',isTrue([1]));现在我们可以观察到它的工作速度快了2倍多。
在这里,相同案例的执行情况如下,重复100次:
var isTrue = function(value) {
switch (typeof(value)) {
case "string":
return !(value === '0' || value === 'false');
case "number":
case "boolean":
return !!value;
case "object":
return Object.keys(value).length > 0
}
}
var isTrue_2 = function(value) {
return (!!value && value !== '0' && value !== 'false'
&& !!(typeof value !== 'object' || Object.keys(value).length));
}
var values = [false, 'false', true, 0, 1, '0', '1', 'test', {}, [], {a: 1}, [1]],
times = 100;
console.time('isTrue');
for (var i = 0; i < times; i++) {
for (var value of values) {
isTrue(value);
}
}
console.timeEnd('isTrue');
console.time('isTrue_2');
for (var i = 0; i < times; i++) {
for (var value of values) {
isTrue_2(value);
}
}
console.timeEnd('isTrue_2');最后一点感兴趣的是:如果您可以掌握一些关于特殊需求出现多少的统计数据,您可以更改条件的顺序,将最常见的情况放在第一位,从而提高性能。
发布于 2016-10-27 11:25:15
由于您有特殊的falsey情况,您的检查类型一类型看我是唯一的选择。然而,我建议两项改进:
首先,如果值是布尔值,则不需要!!,因为它只能是True或False。移除操作者会稍微提高性能。我会替换
case "number":
case "boolean":
return !!value;使用
case "number":
return !!value;
case "boolean":
return value;第二个改进是switch块应该有一个default语句,而您的case "object"是一个很好的候选,所以我会替换
case "object":
return Object.keys(value).length > 0使用
default:
return Object.keys(value).length > 0https://codereview.stackexchange.com/questions/145413
复制相似问题