我正在尝试编写一个我可以用来测试所有伪造值的函数,保持简洁,因为它将经常在服务器端运行.
function is_falsy(val){ val = eval(String(val).toLowerCase()); return !!val; }
我想知道是否有任何方法可以缩短它,或者使用eval()
可能带来的负面影响.JSBIN告诉我这是"邪恶的".
JSBIN
假设这val
是一个表示JavaScript 文字的字符串,那么我们可以利用JavaScript中唯一的false-y值这样的事实:
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)
将是"真",尽管它评估的undefined
绝对不是真值y.
当然,也许原始数据可以被写入/消费,因此根本不需要这样的构造.