我知道 Javascript 的 eval 可以评估表达式,例如
(true) && (false)
(true) || (false)
etc.
但是,eval 的规范是否包括评估涉及未知数的语句,例如
(true) && (null)
(true) || (null)
(null) && (null)
(null) || (null)
etc.
我已经在代码中尝试过这个并看到它做到了,但这是预期的行为吗?Javascript eval 规范是这样说的吗?
我知道 Javascript 的 eval 可以评估表达式,例如
(true) && (false)
(true) || (false)
etc.
但是,eval 的规范是否包括评估涉及未知数的语句,例如
(true) && (null)
(true) || (null)
(null) && (null)
(null) || (null)
etc.
我已经在代码中尝试过这个并看到它做到了,但这是预期的行为吗?Javascript eval 规范是这样说的吗?
Javascript eval 是否正确评估三态布尔逻辑?
定义“正确”。Javascript 定义了行为。Eval
在 Javascript 中,将字符串评估为 javascript 代码。SQL 也定义了行为。两者的行为不同。
在 javascript 中,null
行为类似于false
布尔表达式(是假的)。
0
, NaN
, ""
, null
, undefined
(当然还有false
)都是假的。对象、非空字符串和非零数字(当然还有true
)都是真实的。
&&
返回第一个虚假参数(如果有)或最后一个参数(惰性 AND),并且不计算其余参数。null && "anything"
是null
。这可以用在像console && console.log && console.log()
.
||
返回第一个真实参数(如果有)或最后一个参数(惰性或),并且不评估其余参数。null || "something"
是"something"
。这可以用在像这样的语句中var xhr = XmlHttpRequest || ItsReplacementInOlderBrowsers
!null
评估为true
。if(null) ...
评估else
分支。这同样适用于任何虚假的事物。
从技术上讲,未定义的变量是undefined
,不是null
。不过,两者都是虚假的。
null 的计算结果为 false,但请记住,还有更多涉及 null 的细节(例如:使用 ===)。
请查看此页面。它更详细地介绍了这一点: http ://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN