先做一道题:
var val = 'abcd';
console.log('Value is ' + (val === 'abcd') ? 'A' : 'B');
控制台打印出的结果是 // A
因为连接符的优先级高于三元运算符,所以该题目相当于:'Value is ' + true ? 'A' : 'B',由此得出该题的两个变体:
console.log('Value is ' + val === 'abcd' ? 'A' : 'B'); // B
console.log('Value is ' + (val === 'abcd' ? 'A' : 'B')); // Value is A
总结一个运算符优先级表格,清晰明了
优先级 | 运算类型 | 关联性 | 运算符 |
20 | 圆括号 | () | |
19 | 访问调用 | 从左到右 | ... . ..., ...[...], new带参数:new ...(...) ,函数调用:...(...) |
18 | new(无参数) | 从右到左 | new(创建实例) |
17 | 后置递增 | 从右到左 | ...++, ...-- |
16 | 非 | 从右到左 | !, ~, +, -, ++..., --..., typeof(返回字符串), void, delete, await |
15 | 幂 | 从右到左 | ** |
14 | 乘除 | 从左到右 | *, /, % |
13 | 加减 | 从左到右 | +, - |
12 | 按位左移 | 从左到右 | <<, >>, >>>(无符号) |
11 | 小于 | 从左到右 | <, <=, >, >=, in(属性是否存在,右侧必须是对象), instanceof |
10 | 等号 | 从左到右 | ==, !=, ===, !== |
9 | 按位与 | 从左到右 | & |
8 | 按位异或 | 从左到右 | ^(相同为0,不同为1) |
7 | 按位或 | 从左到右 | | |
6 | 逻辑与 | 从左到右 | && |
5 | 逻辑或 | 从左到右 | || |
4 | 条件运算符 | 从右到左 | ... ? ... : ... |
3 | 赋值 | 从右到左 | =, +=, -=, *=, /=, %=, <<=(左移), >>=(右移),>>>=(无符号), &=, ^=, |= |
2 | yield,yield* | 从右到左 | |
1 | 展开运算符 | ... | |
0 | 逗号 | 从左到右 | , |