while and do

运算符优先级

关于运算符的优先级,存在下面的优先级级别:(因此当我们在表达式中出现下面这些情况的时候, 我们注意符号的优先级)
. [ ] ( ) 提取属性与调用函数 (优先级 () > .)
delete new typeof + - ! 一元运算符
* / % 乘法, 除法, 求余
+ - 加法/ 连接 减法
>= <= > < 不等式运算符
=== !== 等式运算符
&& 逻辑与
`
?: 三元
使用运算符优先级中注意: && > ||下面是一些使用运算符的一些例子:
  1. 对于点号运算符以及加号运算符
1
2
3
+"2.34567".toFixed(2);
// 我们的本意是先想要将字符串 "2.34567" 转化为数字在利用 toFixed(2) 进行保留两位小数
// 但是返回错误 uncaught TypeError "2.34567".toFixed(2) is not a function
上面是因为使用上面的表达式的时候 . 号的操作符优先级要高于 + 所以先计算的是字符串的 toFixed() 函数, 当然会出现错误, 解决办法, 添加 () 因为这时候括号的优先级要高于点号:
1
(+"2.34567").toFixed(2)
  1. 逻辑与的操作符 && 的操作符优先级要高于 || 的操作符优先级。例如对于下面的这个程序而言:
    1
    2
    true || false && false
    // 因为这里 && 操作符的优先级要高于 || 因此这里会返回 true
    注意: 这里对于 || 以及 && 操作符的理解要正确:这两个操作符返回的都是值,而不是 true 或者 `false
  2. [] == ![]
  上面这个等式是一个很有意思的等式, 理解这个等式有助于我们加深对于于运算符优先级的理解, 并且在上面的这个公式中还有涉及到了隐式转换的一些知识点。

  在上面这个过程中, 因为 `!` 的优先级要高于 `==`, 因此先执行 `!` 进行类型转换, 因为这里 `[]` 是真值,(只要不属于假值的都是真值,你别看我这里是一个空数组)

  >通过使用布尔强制类型转换结果为 `false` 的被称作假值, 假值有下面几种:
  >
  >`undefined`, `null`, `false`, `+0, -0 和 NaN`, " "
  >
  >ps: 其他的类型不要进来 (`[], {}` : 你们看我干嘛?)

  首先执行下面的操作:

  
1
![] ===> false
这个时候等号右边的值变成了 `false`,这个时候使用 `==` 会进行强制类型转换,将布尔值转换为数字
1
Number(false) ===> 0
这个时候 `==` 两边分别是 `object` 以及 `number` 类型的值, 这个时候需要将 `obejct` 转为数字:
1
Number([].valueOf()) ===> 0
因此, 上面的等式经过转换之后,变成了下面的这种:
1
0 === 0 // true