运算符优先级

题目

答案

yideng

解析

加法的优先级高于三元。所以先计算左边的加法,得到一个字符串,然后运用三元,结果为yideng

拓展

如果将该题目变形一下,改成这样:

const value = !!Number(['0']) ? 'yideng' : 'undefined';
console.log(value);

这里的结果又是多少呢?

这里容易误导人的点在于Number(['0'])。这里在转化的时候,['0']先被去掉了外层的数组包裹,转化成了**'0',然后Number('0')结果是0**.后续的过程就显而易见啦。

附录

数组转化为数字的示例以及运算符优先级。

数组转数字

Number('0');  // 0
Number('1');  // 1
Number('2');  // 2
// ...

Number('a');  // NaN
Number('0', '1');  // NaN

运算符优先级

优先级 运算符 描述 结合性
1 ++ -- 后缀自增与自减 从左到右
() 函数调用
[] 数组下标
. 结构体与联合体成员访问
-> 结构体与联合体成员通过指针访问
(type){list} 复合字面量(C99)
2 ++ -- 前缀自增与自减 从右到左
+ - 一元加与减
! ~ 逻辑非与逐位非
(type) 类型转型
* 间接(解引用)
& 取址
sizeof 取大小
_Alignof 对齐要求(C11)
3 * / % 乘法、除法及余数 从左到右
4 + - 加法及减法
5 << >> 逐位左移及右移
6 < <= 分别为 < 与 ≤ 的关系运算符
> >= 分别为 > 与 ≥ 的关系运算符
7 == != 分别为 = 与 ≠ 关系
8 & 逐位与
9 ^ 逐位异或(排除或)
10 | 逐位或(包含或)
11 && 逻辑与
12 || 逻辑或
13 ?: 三元条件 从右到左
14 = 简单赋值
+= -= 以和及差赋值
*= /= %= 以积、商及余数赋值
<<= >>= 以逐位左移及右移赋值
&= ^= |= 以逐位与、异或及或赋值
15 , 逗号 从左到右