创建一个javascript“hasValue”util方法

时间:2015-11-20 21:45:45

标签: javascript

一个优秀的javascript程序员很清楚这个测试:

if (typeof(dummy) != 'undefined' && dummy != null && dummy != '') {
  // Do stuffs
}

实际上,此测试确保虚拟变量具有值。所以我试着写这个功能。我的测试案例是:

hasValue(undefined) => should returns false
hasValue(null) => should returns false
hasValue('') => should returns false
hasValue(' ') => should returns true
hasValue([]) => should returns false
hasValue({}) => should returns false
hasValue(true) => should returns true
hasValue(false) => should returns true
hasValue(0) => should returns true
hasValue(new Date()) => returns false, but should returns true ?

这是功能:

function hasValue (v) {
  if (typeof v === 'object') {
    for (key in v) {
      if (v.hasOwnProperty(key)) {
        return true;
      }
    }
    return false;
  }
  if (v === false) {
    return true;
  }
  if (v === 0) {
    return true;
  }
  return (typeof(v) != 'undefined' && v != null && v != '');
}

有没有人看到错误或任何优化,或者我忘了某些情况?

2 个答案:

答案 0 :(得分:2)

这是一种糟糕的工具方法。您将以下决定汇总到一个函数中:

  • 您是否希望[]表示“用户未选择任何选项,再次询问”或“用户未选择任何选项,继续”?
  • 您是否希望{}表示“没有选项传递给函数”或{}表示“未传递给函数的选项;使用默认选项”?
  • 您是否希望' '成为中间名的有效用户输入,但''无效?
  • 您是否希望0成为有效的用户ID,即使您的数据库返回它意味着没有用户ID?

逻辑依赖于域。如果您正在编程,例如,用户选项的仪表板,您可以实现UserDashboard.hasValuefalse将返回[],其余如上所述,但这是依赖于域的逻辑,而不是一些通用的underscore.js或jQuery或node.js核心模块实用程序函数。

即便如此,阅读也是一团糟。如果我看到该行

if(hasValue(v)) {
   ...
 }

我现在必须阅读hasValue中的神秘逻辑,找出你允许的假名值[]{}''的可能组合。禁止。如果您只是需要检查v是否null编写代码来执行此操作。

有各种语言的方法,如isNullOrEmpty,这是一种像你所说的实用方法,只有它的名字告诉你完全它做了什么,它不会尝试做所有事情。它可能有比你想象的更冗长的名字。这是对的;它必须,或者它模糊了它实际上在做什么。

答案 1 :(得分:0)

除了一些代码减少,你正在测试对象

if (typeof v === 'object') {
    return Object.keys(v).length > 0;
}