4-1 一元操作符

  1. 递增/递减操作符
  2. let s1 = "2";
  3. let s2 = "z";
  4. let b = false;
  5. let f = 1.1;
  6. let o = {
  7. valueOf() {
  8. return -1;
  9. }
  10. };
  11. s1++; // 值变成数值 3
  12. s2++; // 值变成 NaN
  13. b++; // 值变成数值 1
  14. f--; // 值变成 0.10000000000000009(因为浮点数不精确)
  15. o--; // 值变成-2
  1. let s1 = "01";
  2. let s2 = "1.1";
  3. let s3 = "z";
  4. let b = false;
  5. let f = 1.1;
  6. let o = {
  7. valueOf() {
  8. return -1;
  9. }
  10. };
  11. s1 = -s1; // 值变成数值-1
  12. s2 = -s2; // 值变成数值-1.1
  13. s3 = -s3; // 值变成 NaN
  14. b = -b; // 值变成数值 0
  15. f = -f; // 变成-1.1
  16. o = -o; // 值变成数值 1

4-2 位操作符

  1. 负值以一种称为二补数(或补码)的二进制编码存储
  2. (1) 确定绝对值的二进制表示(如,对于-18,先确定 18 的二进制表示);
  3. (2) 找到数值的一补数(或反码),换句话说,就是每个 0 都变成 1,每个 1 都变成 0;
  4. (3) 给结果加 1。
  5. let num = -18;
  6. console.log(num.toString(2)); // "-10010"

按位非

  1. 按位非的最终效果是对
  2. 数值取反并减 1,就像执行如下操作的结果一样:
  3. let num1 = 25;
  4. let num2 = -num1 - 1;
  5. console.log(num2); // "-26"

按位与

  1. 都是1才是1
  2. 25 和 3 的按位与操作的结果是 1。为什么呢?看下面的二进制计算过程:
  3. 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  4. 3 = 0000 0000 0000 0000 0000 0000 0000 0011
  5. ---------------------------------------------
  6. AND = 0000 0000 0000 0000 0000 0000 0000 0001
  7. 如上所示,25 和 3 的二进制表示中,只有第 0 位上的两个数都是 1。于是结果数值的所有其他位都
  8. 会以 0 填充,因此结果就是 1。

按位或

  1. 都是0才是0
  2. 可见 25 和 3 的按位或操作的结果是 27:
  3. 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  4. 3 = 0000 0000 0000 0000 0000 0000 0000 0011
  5. ---------------------------------------------
  6. OR = 0000 0000 0000 0000 0000 0000 0001 1011

按位异或

  1. 一样就为1
  2. 可见,25 和 3 的按位异或操作结果为 26,如下所示:
  3. 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  4. 3 = 0000 0000 0000 0000 0000 0000 0000 0011
  5. ---------------------------------------------
  6. XOR = 0000 0000 0000 0000 0000 0000 0001 1010

4-3 布尔操作符

  1. 布尔操作符一共有 3 个:逻辑非、逻辑与和逻辑或。

  1. console.log(!false); // true
  2. console.log(!"blue"); // false
  3. console.log(!0); // true
  4. console.log(!NaN); // true
  5. console.log(!""); // true
  6. console.log(!12345); // false

  1. let found = true;
  2. let result = (found && someUndeclaredVariable); // 这里会出错
  3. console.log(result); // 不会执行这一行

  1. let found = true;
  2. let result = (found || someUndeclaredVariable); // 不会出错
  3. console.log(result); // 会执行