此次讨论一下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才自增,这就是后置递增递减运算符的特征。