Javascript-条件语句的检查顺序是什么
我很想知道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
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没有正在访问的属性pro和val,因此它会引发异常。请尝试此操作
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)