Javascript eval是否正确评估包含空变量的三态布尔逻辑,即未知数?

时间:2012-12-12 14:33:42

标签: javascript eval

我知道Javascript的eval可以评估像

这样的表达式
(true) && (false)
(true) || (false) 
 etc.

但是,eval的规范是否包括评估涉及未知数的语句,如

(true) && (null)
(true) || (null)
(null) && (null)
(null) || (null)
 etc.

我在代码中尝试了这个并看到它做到了,但这是预期的行为吗? Javascript eval规范是否说明了这一点?

3 个答案:

答案 0 :(得分:0)

null的计算结果为false,但请记住,有更多细节涉及null(例如:使用===)。

请查看此页面。它更详细地介绍了这一点: http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN

答案 1 :(得分:0)

null不是“未知”,当在比较中作为操作数放置时,它只是被强制转换为布尔值(false)。有关详细信息,请参阅此"truthy table"null行。

我不相信eval的行为有任何“规范” - 它只需要javascript的字符串表示并在当前上下文中将其作为javascript执行。没有理由

eval('(true) && (null)');

会给你不同的结果

(true) && (null)

另外,eval is evil

答案 2 :(得分:0)

  

Javascript eval是否正确评估了三态布尔逻辑?

定义“正确”。 Javascript定义了行为。 Javascript中的Eval将字符串评估为javascript代码。 SQL也定义了行为。两者的行为都不同。

在javascript中,null在布尔表达式中表现为false(是假的)。

0NaN""nullundefined(当然还有false)都是假的。对象,非空字符串和非零数字(当然还有true)都是真的。

&&返回第一个falsy参数(如果有)或最后一个参数(lazy AND),并且不评估其余参数。 null && "anything"null。这可以在console && console.log && console.log()之类的语句中使用。

||返回第一个truthy参数(如果有)或最后一个参数(lazy OR),并且不评估其余参数。 null || "something""something"。这可以在var xhr = XmlHttpRequest || ItsReplacementInOlderBrowsers

等语句中使用

!null评估为trueif(null) ...评估else分支。这同样适用于任何虚假的事情。

从技术上讲,未定义的变量是undefined,而不是null。但两者都是假的。