在js里面,逻辑非和逻辑与的很多计算和平时所见的计算有一定的不同。例如:
<html>
<head>
<title>||的隐式转换的计算</title>
</head>
<body>
<script>
var c = (a = 3) || (b = 4);
console.log(a); //3
console.log(c); //3
console.log(b); //报错 b is not defined
</script>
</body>
</html>
在这里面进行逻辑或的操作的时候,并没有像我们想的那样,直接先算a = 3还有b = 4;
而是先将 || 两边的部分分开,然后先算左边部分(满足真值阻塞:只要遇到真值就会马上输出,没有真值就会输出最后一个假值),判断其是否满足为真值,如果满足的话,就不会去运行右边的部分,直接输出左边部分的值。故上述代码只会执行 a = 3,而在 || 右边的就不会执行,就只会返回a的值(3)还有c的值(3),在执行console.log(b)时,代码就会报错。
<html>
<head>
<title>&&隐式转换的计算</title>
</head>
<body>
<script>
var d = (a = 4) && (b = 0) && (c = 2);
console.log(a); //4
console.log(b); //0
console.log(c); //报错 c is not defined
console.log(d); //0 会被阻断不会输出,但是值为0
</script>
</body>
</html>
在这里面进行逻辑与的操作的时候,也没有像我们想的那样,直接先算a = 3,b = 4还有c = 2,
而是将这三个式子经&&符号分割开从左往右进行赋值,当遇到假值的时候就会直接输出假值给d,不会继续执行后面的式子,当没有找到假值的时候,就会一直执行到最后,然后将最后一个式子的值传给d(假值阻塞)。故上述代码就是会在执行b = 0,之后就不会继续执行了,并将值赋给d,然后因为c = 2,没有进行运算,故c是没有定义的,运行console.log(c)时就会报错。