2

我在每个页面上运行一个 UI 组件,在其中一个页面上,有一个额外的功能链接到它。UI 组件有一个名为的布尔值MyValue,额外的功能有一个名为的对象ExtraObject,其属性之一是一个名为 的布尔值ExtraBool

我想测试 MyValue 是否为真并且 ExtraObject.ExtraBool 是否为假,但仅在 ExtraObject 存在的情况下。这样,如果我在没有 ExtraObject 的页面上,就没有错误。

我试过这个:

if (MyValue === true && 
    (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {...}

我应该如何重写这个?

目前,我不断收到“ExtraObject 未定义错误”。

谢谢。

4

4 回答 4

2

那应该是:

typeof ExtraObject === "undefined"

typeof将表达式的类型作为字符串返回,因此您需要将名称"undefined"与结果进行比较。

在我看来,你的条件有点太明确了。我会选择更短的东西:

if (MyValue && !(ExtraObject && ExtraObject.ExtraBool)) {...}

如果您使用自己的 GUI 代码进行通信,则可以假设类型与预期一致。JavaScript 中的类型检查相当麻烦,所以如果你知道你在处理什么,你可以不那么明确。(但这不适用于用户输入。永远不要相信用户输入。)

于 2012-06-12T20:57:29.403 回答
1

逻辑并不完全正确:

if (MyValue && ExtraObject && !ExtraObject.ExtraBool) { ... }

我猜这null也不应该是一个值ExtraObject;也就是说,我认为您的条件确实更好地说明它应该是对对象的引用。

MyValue因此,我所写的条件在“真实”时为真,ExtraObject是对真实对象的引用,并且该ExtraBool对象的属性为“虚假”。

有时需要对布尔常量进行显式比较,但在我看来,这是一种代码异味。(当然,仅检查真实性/虚假性也可能很危险......)

编辑如果您的要求是表达式为真时MyValue为真并且不是 ExtraObject对对象的引用或者它的ExtraBool属性为真,那么我会这样写:

if (MyValue && (!ExtraObject || !ExtraObject.ExtraBool)) { ... }

哪个“更好”是个人喜好和经验的问题。

于 2012-06-12T20:58:06.557 回答
1

真值表时间!

A 是MyValue*
B 是window.ExtraObject**
C 是ExtraObject.ExtraBool

A B C | O
------+--
0 0 0 | 0
0 0 1 | 0
0 1 0 | n/a***
0 1 1 | 0
1 0 0 | 1
1 0 1 | n/a***
1 1 0 | 1
1 1 1 | 0

我们从这些值中发现,最简单的方程式O是:

A && !C

所以你的代码应该是:

if (MyValue && !ExtraObject.ExtraBool) {}

ExtraObject但是,当然,您提到如果未定义不想遇到问题:

var extraBool = window.ExtraObject ? ExtraObject.ExtraBool : false;
if (MyValue && !extraBool) {}

另一种写作extraBool方式是:

var extraBool = window.ExtraObject && ExtraObject.ExtraBool;

然后你可以内联这个:

if (MyValue && !(window.ExtraObject && ExtraObject.ExtraBool)) {}

写作的另一种选择!(a && b)!a || !b,这意味着:

if (MyValue && (!window.ExtraObject || !ExtraObject.ExtraBool)) {}

也是正确的。

* 这可能MyValue===true取决于您需要的严格程度
** 或者typeof ExtraObject !== 'undefined'
*** 实际上不可能有ExtraObject未定义和访问权限ExtraObject.ExtraBool

于 2012-06-12T21:24:42.113 回答
-1
if ((MyValue === true) && (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {}
于 2012-06-12T20:58:19.387 回答