我知道Javascript的eval可以评估像
这样的表达式(true) && (false)
(true) || (false)
etc.
但是,eval的规范是否包括评估涉及未知数的语句,如
(true) && (null)
(true) || (null)
(null) && (null)
(null) || (null)
etc.
我在代码中尝试了这个并看到它做到了,但这是预期的行为吗? Javascript eval规范是否说明了这一点?
答案 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
(是假的)。
0
,NaN
,""
,null
,undefined
(当然还有false
)都是假的。对象,非空字符串和非零数字(当然还有true
)都是真的。
&&
返回第一个falsy参数(如果有)或最后一个参数(lazy AND),并且不评估其余参数。 null && "anything"
是null
。这可以在console && console.log && console.log()
之类的语句中使用。
||
返回第一个truthy参数(如果有)或最后一个参数(lazy OR),并且不评估其余参数。 null || "something"
是"something"
。这可以在var xhr = XmlHttpRequest || ItsReplacementInOlderBrowsers
!null
评估为true
。 if(null) ...
评估else
分支。这同样适用于任何虚假的事情。
从技术上讲,未定义的变量是undefined
,而不是null
。但两者都是假的。