这次讨论一下JavaScript运算符的结合性和优先级问题
相关知识链接:MDN运算符优先级,jingxian:浅谈JS运算符&&和|| 及其优先级
来源一篇知乎上的问题:JavaScript中运算符优先级的问题
这是知友乐已生悲回答的答案:
var a = 0;
console.log(
5 > 3 && 8 < 4 + (a = 5)
)
表达式“5 > 3 && 8 < 4 + (a = 5)”自左向右扫描。首先处理“5 > 3”(因为关系运算符“>”优先于逻辑运算符“&&”)。在关系运算符“>”两侧的5 和 3 作为数值参加关系运算,“5>3”的值为true。再进行“true && 8 < 4 + (a = 5)”的运算,“&&”左边为true,则进行它右边表达式的运算。8的左侧为“&&”,右侧为“<”运算符,根据优先规则,应先进行“<”的运算,即先进行“8 < 4 + (a = 5)”的运算。现在4的左侧为“<”,右侧为“+”运算符,而“+”运算符优先于“<”,应先进行“4 + (a = 5)”,由于“()”的级别最高,因此先进行“a=5”,得到结果5。然后进行“4 + 5”的运算,得到结果9,再进行“8 < 9”的运算,得到true,最后进行“true && true”,得到true。(这个例子是模仿《c程序设计》第四版94页的例子)
作者:乐己生悲
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我在变换一下几个式子,试着求值。
5 > 3 && 8 < 4 + (a = 5);
false && 8 < 4 + 3 // false : 由于AND操作符左边的运算为false,短路,直接返回false
5 > 2 || 2 > 4 && 3 > 2
// true : 依次从左向右运算,5>2:true,则 true || 2 > 4 && 3 > 2。由于OR操作符左边的运算为真,短路,直接返回OR左边的值。右边表达式全部忽略;
1 > 2 || 0 && 3 > 2
// 0:从左至右,OR表达式为左结合,则1>2:false,则false || 0 && 3 > 2。此时是对OR整个右边的值求值,则0 && 3 > 2,>优先级高于AND,则3>2:true。
// 此时则为0 && true,AND为左结合,先对左边求值,求值为0,直接返回0,此时最后才是false || 0,OR运算符为左结合,左边求值false,则直接返回右值0。
// 看来的确是对的-0-,我是边分析最后才console,万一错了,上面的思路都编程瞎掰的了......
var a = 5;
0 || 6 > a++ && 50 > (3+2)*2
console.log(a);
// 依旧从左至右,后面我会用函数来证明,JavaScript执行语句大多数情况上到下,左到右。优先级是根据结合性来判断的,并不是单纯的谁优先谁就先算
// 对OR左边求值,为0,则继续对右边求值,即6 > a++ && 50 > (3+2)*1,依旧从左至右。a++是后置自增,后置运算无结合性。则会先使用a后自增,此时相当于
// (6 > 5)++,运算进行到AND,依旧是左结合,左边的运算已经为true,则直接对右边继续求值,即50 > (3+2)*2,大括号优先级最高,先加法后乘法,则(3+2)*2:10
// 最后才是50 > 10,结果为true,则AND返回的是右边表达式的值:true。最后最后得出true。
// console我对了,可以试试把AND右边整体的值换成1,再次console应该是:1。
// a:6
var x = 5;
var y = 3+2*x++;
alert(y+" | "+x) // y的值是13还是15? 是13
// 从左至右,此时遇上的运算符有+、*、后置自增。则应考虑优先级,即(3 + (2 * (x)))++
// 没错,自增是最后才进行的。具体可以看segmentfault里JS表达式语句4.6.4
// 计算2*5之后,与3相加,最后赋值给y,做完这些,x才自增,这就是后置递增递减运算符的特性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。