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

Javascript eval是否正确评估包含空变量(即未知变量)的三态布尔逻辑?,javascript,eval,Javascript,Eval,我知道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规范会这样说吗?

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

请查看这一页。它更详细地介绍了这一点:

null
不是“未知”的,在比较中作为操作数放置时,它只是强制为布尔值(
false
)。有关更多信息,请参阅本文档中的
null

我不相信对
eval
的行为有任何“规范”-它所做的一切都是使用javascript的字符串表示,并在当前上下文中作为javascript执行。没有理由

eval('(true) && (null)');
会给你不同的结果

(true) && (null)

Javascript eval是否正确计算三态布尔逻辑

定义“正确”。Javascript定义了行为Eval将字符串作为Javascript代码进行计算。SQL也定义了行为。两者的行为是不同的

在javascript中,
null
的行为类似于布尔表达式中的
false
(是falsy)

0
NaN
null
未定义的
(当然还有
false
)都是错误的。对象、非空字符串和非零数字(当然还有
true
)都是真实的

&&
返回第一个falsy参数(如果有)或最后一个参数(lazy和),不计算其余参数
null&“任何东西”
都是
null
。这可以在诸如
console&&console.log&&console.log()
之类的语句中使用

|
返回第一个truthy参数(如果有)或最后一个参数(lazy或),不计算其余参数
null | |“某物”
“某物”
。这可以在诸如
var xhr=XmlHttpRequest | | itsReplacementInoderBrowser

!null
计算结果为
true
if(null).
计算
else
分支。这同样适用于任何虚假的东西


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

null
在Javascript中是假的,而不是“null”。哦,你需要提醒一下eval是邪恶的吗?@JanDvorak我正在使用eval生成测试数据。这没什么不好的。与null相比,您指的是哪些注意事项?我想你在想楠。Null的计算结果与该列表中除NaN之外的所有其他项一样。@DennisPlucinik:也许“警告”是个不好的术语。我指的是应该使用===的情况。我将重新表述答案。==无论如何都应该使用。==在任何情况下都比它容易混淆和出错更有用。完全不相关。
eval
在当前范围内执行,而不是在全局范围内执行。这个答案听起来好像不是这样的。请注意,规范中的上下文指的是
这个
对象。@JanDvorak好的,我想的是
设置超时
,我将进行编辑。谢谢