我正在尝试编写一个函数,我可以使用它来测试所有的虚假值,保持简洁,因为它将经常在服务器端运行。
function is_falsy(val){
val = eval(String(val).toLowerCase());
return !!val;
}
我想知道是否有任何方法可以缩短它,或者使用eval()
可能带来的负面影响是什么。 JSBIN告诉我这是“邪恶的”。
答案 0 :(得分:5)
假设 val
是字符串代表JavaScript 文字,那么我们可以利用唯一的事实JavaScript中的false-y values是:
''
)或(""
)因此,忽略边缘情况(如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)
永远不需要将包含false
或undefined
的字符串视为虚假。这样做会对可能完全不相关的数据提供误报(或漏报)。
想象一下其他什么会被视为“虚假”:
!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;
}
}