在此函数中使用eval()是否不正确?没有它可以以某种方式完成相同的功能吗?

时间:2014-01-07 03:39:14

标签: javascript

我正在尝试编写一个函数,我可以使用它来测试所有的虚假值,保持简洁,因为它将经常在服务器端运行。

function is_falsy(val){
   val = eval(String(val).toLowerCase());
   return !!val;
}

我想知道是否有任何方法可以缩短它,或者使用eval()可能带来的负面影响是什么。 JSBIN告诉我这是“邪恶的”。

JSBIN

3 个答案:

答案 0 :(得分:5)

假设 val字符串代表JavaScript 文字,那么我们可以利用唯一的事实JavaScript中的false-y values是:

  • 0(+或 - )
  • 的NaN
  • 空字符串('')或(""
  • 未定义

因此,忽略边缘情况(如0.0)我们就可以像这样编写它(可以像原始代码一样执行小写):

function is_falsey_literal (lit) {
  if (['""', "''", "null", "undefined", "false", "0", "NaN"].indexOf(lit) >= 0) {
    return true;
  }
  // Ideally there are more checks on numeric literals such as `-0` or `0.0`.
  return false;
}

如果需要检查完整的表达式,那么eval可能“有效”,与编写完整的JavaScript-in-JavaScript解析器相比,它可能更实用。例如,在上面,(void 0)的输入字符串将为“true”,尽管它的计算结果为undefined,这绝对不是真值y。

当然,也许原始数据可以被编写/消费,因此根本不需要这样的结构。

答案 1 :(得分:2)

永远不需要将包含falseundefined的字符串视为虚假。这样做会对可能完全不相关的数据提供误报(或漏报)。

想象一下其他什么会被视为“虚假”:

  • !true
  • !1
  • !!true

它正在乞求你的应用程序中的神秘错误。

程序流程应确保undefined值实际作为文字undefined到达您的测试脚本,而不是字符串"undefined"

答案 2 :(得分:1)

如果您只想测试是假的,那么下面就足够了。

function is_falsy(val){
   return !val;
}

如果您想测试字符串是否为'false'之类的假值,那么

function is_falsy(val){
   try {
     return !JSON.parse(String(val).toLowerCase());
   } catch(e) {
     return false;
   }
}