Javascript-条件语句的检查顺序是什么

Javascript-条件语句的检查顺序是什么,javascript,conditional-statements,Javascript,Conditional Statements,我很想知道Javascript中的条件语句。我有两个例子如下: var myObj = {}; console.log(myObj.pro != null && myObj.pro.val != null ? 0 : 1); console.log(myObj.pro.val != null && myObj.pro != null ? 0 : 1); 第二行将打印一个值,但第三行将引发异常。是否从左到右检查状态?当我们在同一行中有许多条件运算符,例如OR、NO

我很想知道Javascript中的条件语句。我有两个例子如下:

var myObj = {};
console.log(myObj.pro != null && myObj.pro.val != null ? 0 : 1);
console.log(myObj.pro.val != null && myObj.pro != null ? 0 : 1);
第二行将打印一个值,但第三行将引发异常。是否从左到右检查状态?当我们在同一行中有许多条件运算符,例如OR、NOT、(),时,它是如何检查的。先检查哪一个? 如果我被误解了,请纠正我

更新:我添加了更复杂的示例:

var !(!A || B && C && D) ? 0 : 1;

我相信它会从左到右执行。但是您有一个未定义的属性
val
。它将以
myObj.pro
开始,它将是
未定义的
。然后,
undefined.val
肯定会在这里引发异常。在第二行中,它没有引发异常,因为它没有传递第一个条件语句

让我们这样标记它

A = myObj.pro != null 

B = myObj.pro.val != null

console.log(A && B != null ? 0 : 1);
因为A是假的,我们在这里不检查B,因为false&有些东西总是假的

这样你就不会因为B没有经过测试而出现异常

第二届

console.log(B && A != null ? 0 : 1);
B在A之前测试 thorws例外是因为 myObj.pro未定义,您正在访问myObj.pro.val

var myObj = {}; 
注:myObj.pro未定义

console.log(myObj.pro.val != null && myObj.pro != null ? 0 : 1); 
thorws exeption是因为它无法首先检查
myObj.pro.val
,因为
myObj.pro
未定义。(找不到未定义的.val)


这就像是在寻找未定义的。val这就是为什么你有一个例外。

这里发生的事情是这样的

console.log(myObj.pro!=null&&myObj.pro.val!=null?0:1)

您的
&
将两个条件分开,例如(
myObj.pro!=null
)[考虑'A']&(
myObj.pro.val!=null?0:1
)[考虑'B']

console.log(A&B?0:1)

<> > <代码> < <代码>给出null,<代码> & & <代码>不要考虑转到<代码> b>代码>,因为它从<代码> < < /代码>中获得了假值。
console.log(B&A?0:1)

但是这里您试图检查抛出错误的
undefined
(在本例中
myObj.pro
undefined
)的值

希望这对你有帮助

更新

var!(!A | | B&C&D)?0 : 1;

假设所有A、B、C、D都有真值,我们从左到右一步一步走:

!A => false

false || B => true

true && C => true

true && D => true

!(true) => false

var false ? 0 : 1;
你得到了
0

这与订单无关。 在您的示例中,myObj={}

因此它没有属性pro(即myObj.pro为空) 这会导致以下语句第一个条件myObj.pro!=null失败。由于使用的条件为&&因此未测试下一个条件,它返回1

在下一个语句中,第一个条件是myObj.pro.val!=空。由于对象myObj没有正在访问的属性proval,因此它会引发异常。

请尝试此操作

var myObj={}

log(myObj.pro!=null&&myObj.pro.val!=null?0:1)


log(myObj.pro!=null&&myObj.pro.val!=null&&myObj.pro!=null?0:1)

第二行
console.log(myObj.pro!=null&&myObj.pro.val!=null?0:1)
myObj.pro
计算为
未定义
,然后与
null
进行比较,返回
false
。我们知道,在AND比较中,当左边的计算结果为
false
时,Javascript会忽略AND的右边。这种合理的行为可以防止解释器遇到异常绑定的右侧代码,该代码本质上是
未定义的。val

第三行继续计算
undefined.val
,它抛出异常并停止解释

如果您有兴趣了解优先级,请查看

在第一种情况下,代码的执行方式与上面类似,myObj.pro=null为false,因此在不运行任何其他内容的情况下,它给出1

console.log(myObj.pro.val != null && myObj.pro != null ? 0 : 1);
在第二种情况下,当它试图读取pro.val(pro未定义,因此没有任何属性可访问)时,会出现错误。 当您尝试访问未定义的属性时,将返回此错误。示例

var obj;
console.log(obj) // undefined;
obj.key // Cannot read property 'key' of undefined(obj is undefined in this case)

请添加对象和可能的值。@Ivar是您的文档适用于所有浏览器吗?@CoWorker只要浏览器遵循语言规范,是的。谢谢,如何检查条件语句是否非常复杂。我们有(),或,而不是。。。。比如!!(甲、乙、丙、丁)?0 : 1;在逻辑上的每个门,您需要给出一个代码示例,在您提到的或门的情况下,如果A为真,则不会改变条件的右侧
console.log(myObj.pro.val != null && myObj.pro != null ? 0 : 1);
var obj;
console.log(obj) // undefined;
obj.key // Cannot read property 'key' of undefined(obj is undefined in this case)