首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查真值的函数。

检查真值的函数。
EN

Code Review用户
提问于 2016-10-27 10:36:39
回答 2查看 203关注 0票数 2

我正在编写一个函数,它接受一个参数并返回一个真值。

我最初的想法只是return !!value,但对于'0'{}[]来说,这将失败。我知道'0'应该是真的,但在我的应用程序中,我们认为它是错误的。

因此,我的函数应该返回false:

  • Falsey值:false0undefinednull''
  • 空白值:{}[]
  • 特殊要求:'0'

因此,考虑到这一点,我更新了下面的代码来处理

代码语言:javascript
复制
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的处理,但这不在当前问题的范围之内。我的问题是,有没有更好的方法来处理同样的问题?

EN

回答 2

Code Review用户

发布于 2016-10-27 23:17:03

我想这样会更快:

  • 第一,仅仅用!!value来评价价值“标准”真理。
  • 然后为您的特殊需求添加条件(包括'false',在您的问题中没有引用,但在您的代码中)

这样,它还可以减少代码,如下所示:

代码语言:javascript
复制
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次:

代码语言:javascript
复制
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');

最后一点感兴趣的是:如果您可以掌握一些关于特殊需求出现多少的统计数据,您可以更改条件的顺序,将最常见的情况放在第一位,从而提高性能。

票数 1
EN

Code Review用户

发布于 2016-10-27 11:25:15

由于您有特殊的falsey情况,您的检查类型一类型看我是唯一的选择。然而,我建议两项改进:

首先,如果值是布尔值,则不需要!!,因为它只能是TrueFalse。移除操作者会稍微提高性能。我会替换

代码语言:javascript
复制
case "number":
case "boolean":
    return !!value;

使用

代码语言:javascript
复制
case "number":
    return !!value;
case "boolean":
    return value;

第二个改进是switch块应该有一个default语句,而您的case "object"是一个很好的候选,所以我会替换

代码语言:javascript
复制
case "object":
    return Object.keys(value).length > 0

使用

代码语言:javascript
复制
default:
  return Object.keys(value).length > 0
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/145413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档