背景

本文是来自JavaScript高级程序设计第4版,记录的是正常定义和需要注意的点(也就是其实不够全面,单纯是为了加深印象而已)

详细说明

一元操作符

递增/递减

++i / —i

  1. let a = 1
  2. console.log(++a) // 2
  3. console.log(a) // 2

i++/i—

  1. let a = 1
  2. console.log(a++) // 1
  3. console.log(a) // 2

注意:

  1. 前缀和后缀的区别在于,前缀是同时操作,后缀是求值后才发生
  2. 下面例子自行查看
    1. a = 'a'
    2. console.log(a++) // NaN
    3. a = '1'
    4. console.log(a++) // 1
    5. a = true
    6. console.log(a++) // 1
    7. a = Infinity
    8. console.log(a++) // Infinity
    9. a = undefined
    10. console.log(a++) // NaN,因为Number(undefined) NaN
    11. a = {}
    12. console.log(a++) // NaN
    13. a = null
    14. console.log(a++) // 0

    一元加减

    符号放前面变量前面的表示方式,是一种数字转换方式
    1. let num = 25
    2. num = +num
    3. console.log(num) // 25
    实际操作中,我们使用这个方式用来转换数字,同Number()方法
    1. a = 'a'
    2. console.log(+a) // NaN
    3. a = false
    4. console.log(+a) // 0
    5. a = Infinity
    6. console.log(+a) // Infinity,Infinity本来就是数字的一种
    7. a = undefined
    8. console.log(+a) // NaN
    9. a = null
    10. console.log(+a) // 0
    11. a = []
    12. console.log(+a) // 0 Number([]) == 0/Number([1]) == 1/Number([1, 'a']) == NaN
    一元减同加,只不过是变了符号

    条件操作符(三元操作符)

    三元操作符其实是if/else的简写形式,代码如下:
    1. let flag = 1
    2. let res = flag === 1 ? 'success' :'failed';

    位操作符

    数值在底层其实都是64位的,而我们的位操作符则是先转换为32位进行操作后,再转换为64位
小知识补充:
1. 有符号整数,一共是32位,前31位表示数值,最后一位表示符号,0代表正数,1代表负数
2. 也存在无符号整数,但是很少,默认就是有符号的,无符号整数只有正数的情况,所以表示的范围更大!
3. 二进制表示32位整数
4. 负数其实就是整数补位,也就是0变成1,1变成0,然后+1

按位非 ~

负号为:~
其实就是讲每一位变成相反的,1变成0,0变成1

  1. let num1 = 25;
  2. let num2 = ~num1;
  3. console.log(num2) // -26

上面这个例子就是,现将25转换为二进制的32位数:000000000000000000000000011001,然后取补,则变成:11111111111111111111111111100110,此时,我们再转换为十进制,就变成了-26
怎么转换为十进制呢?
方法如下:

  1. 先-1,则变成:11111111111111111111111111100101
  2. 取反:00000000000000000000000000011010
  3. 最后算出来就是26,然后加上负号即可

以上结果也可以换一种方式

  1. let num1 = 25;
  2. let num2 = -num1 -1; // -26

两种方式虽然结果相同,但是第一种却更快,因为是位运算

按位与 &

符号:&
其实就是讲每一位进行对比,取并且的值为最后每一位的值

第一个数值的位 第二个数值的位 结果
1 1 1
1 0 0
0 1 0
0 0 0
  1. let res = 25 & 3
  2. console.log(res) // 1

按位或 |

符号:|
其实就是数值的每一位按着或的逻辑确定每一位的值

第一个数值的位 第二个数值的位 结果
1 1 1
1 0 1
0 1 1
0 0 0
  1. let res = 25 | 3;
  2. console.log(res) //27

按位异或 ^

符号:^
按位异或与按位或的区别在于,它只有在一位上是1的时候返回1,如果两位相同,则返回0

第一个数值的位 第二个数值的位 结果
1 1 0
1 0 1
0 1 1
0 0 0
  1. let res = 25 ^ 3;
  2. console.log(res) //26

左移 <<

符号: <<
数字整体向左移动对应位数,后面补0

  1. let val = 2
  2. let newVal = val << 5 //64

有符号右移 >>

符号:>>
跟左移相反,是往右边移动对应位数,前面补0

  1. let val = 64
  2. let newVal = val >> 5; // 2

无符号右移 >>>

符号: >>>
32位都向右移动对应位数
如果是正数,则跟 >> 值相同
如果是负数,则差别可能会很大,因为补充的是0,所以如果是负数,则符号会被挪动

  1. let val = 64
  2. let newVal = val >>> 5; // 2
  3. let val1 = -64
  4. let newVal1 = val1 >>> 5 // 134217726

布尔操作符

逻辑非 !

符号:!
对于现在的值取反
规则如下:

  1. 如果是Boolean类型,则直接对值求反就行,不如true变成false
  2. 如果是对象,则返回false
  3. 如果是空字符串,则返回true
  4. 如果是非空字符串,则返回false
  5. 如果是数值0,则返回true
  6. 如果是非0的数值(包括Infinity),则返回false
  7. 如果是null,则返回true
  8. 如果是NaN,则返回true
  9. 如果是Undefined,则返回true

通常,我们喜欢用!!来对一个未知的类型就行Boolean的转换,结果如果Boolean()

逻辑与 &&

符号:&&
规则如下:

  1. 如果第一个数是对象,则返回第二个数
  2. 如果第二个数是对象,则只有第一个数求值为true的时候才能返回第一个对象
  3. 如果两个都是对象,则直接返回第二个
  4. 如果有一个是null,则返回null
  5. 如果有一个是NaN,则返回NaN
  6. 如果第一个是undefined,则返回undefined

&&是一个短路操作,即如果第一个数已经是false了,那第二个数是不会被求值的,也就是直接不执行了

逻辑或 ||

符号:||
注意点:

  1. 如果两个数都是null,则返回null
  2. 如果两个数都是NaN,则返回NaN
  3. 如果两个数都是undefined,则返回undefined

||也有短路特征,即如果第一个求值是true,则第二个不会执行

乘性操作符

乘法操作 *

注意:

  1. Infinity不管正负想乘,结果是对应符号的Infinity
  2. 任何数 * NaN = NaN
  3. Infinity * 0 = NaN
  4. Infinity * 非0 = Infinity
  5. 非数值做乘法,则先转换为数值再乘

    除法操作 /

    注意:
    有任意一个数字是NaN,则返回NaN
    1. 0 / 0 // NaN
    2. Infinity / Infinity // NaN
    加性操作符
    指数操作符
    关系操作符
    相等操作符
    赋值操作符