操作符

位操作符

按位非(NOT)

按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反转。

1
2
3
4
5
let num1 = 4 // 二进制码 0000000000000000000000000000100
let num2 = ~num1 // 二进制 1111111111111111111111111111011 反转(补码) -(num1+1)
// 1111111111111111111111111111010 反码
// 1000000000000000000000000000101 原码
console.log(num2) // -5

注意:正数的原码、反码、补码相同,负数在计算机中的存储为补码,补码转换为原码才可以看出负数的值,步骤为补码-(-1)->反码-(除符号位外按位反转:0为正,1为负)->原码

按位与(AND)

按位与操作符由一个和号字符(&)表示,它有两个操作符数

第一个数值值位 第二个数值的位 结果
1 1 1
1 0 0
0 1 0
0 0 0
1
2
// 按位与
console.log(3 & 5) // 011 & 101 = 001

按位或(OR)

按位或操作符由一个和号字符(|)表示,它有两个操作符数

第一个数值的位 第二个数值的位 结果
1 1 1
1 0 1
0 1 1
0 0 0
1
2
// 按位或
console.log(3 | 5) // 011 | 101 = 111

按位异或(XOR)

按位异或操作符由一个和号字符(^)表示,它有两个操作符数

第一个操作数值值位 第二个操作数值 结果
1 1 0
1 0 1
0 1 1
0 0 0
1
2
// 按位或
console.log(3 ^ 5) // 011 ^ 101 = 110

左移

左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数

1
2
// 对3左位移3
console.log(3 << 3) // 11 << 3 = 11000

右移

右移操作符由两个大于号(>>)表示,这个操作符会将数值的所有位向右移动指定的位数

1
2
// 对3右位移3
console.log(24 >> 3) // 11000 >> 3 = 00011

无符号右移

无符号右移操作符由三个大于号(>>>)表示,这个操作符会将数值的所有32位向右移动指定的位数

1
2
3
4
5
// 对3向无符号右移3
// 正数
console.log(24 >>> 3) // 11000 >> 3 = 00011
// 负数,32位整体右移造成数值巨大
console.log(-24 >>> 3) // 536870909

布尔操作符

布尔操作符有3个: 非(NOT)、与(AND)、或(OR)。

逻辑非

逻辑非操作符由一个叹号(!)表示,这个操作符会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为布尔值再进行求反操作。

逻辑非操作符遵循下列规则:

  • 如果操作数是一个对象,返回 false
  • 如果操作数是一个空字符串,返回 true
  • 如果操作数是一个非空字符串,返回 false
  • 如果操作数是数值 0, 返回 true
  • 如果操作数是任意非 0 数值 (包括Infinity), 返回 false
  • 如果操作数是 null,返回 true
  • 如果操作数是 NaN,返回 true
  • 如果操作数是 undefined,返回 true

逻辑与

逻辑与由两个和号(&&)表示,有两个操作数。

第一个操作数值值位 第二个操作数值 结果
true true true
true false false
false true false
false false false

它遵循下列规则:

  • 如果第一个操作数是对象,则返回第二个操作数
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象
  • 如果两个操作数都是对象,则返回第二个操作数
  • 如果有有一个操作数是 null,则返回 null
  • 如果有有一个操作数是 NaN,则返回 NaN
  • 如果有有一个操作数是 undefined,则返回 undefined

逻辑或

逻辑或由两个和号(||)表示,有两个操作数。

第一个操作数值值位 第二个操作数值 结果
true true true
true false true
false true true
false false false

它遵循下列规则:

  • 如果第一个操作数是对象,则返回第一个操作数
  • 如果第一个操作数的求值结果为false,则返回第二个操作数
  • 如果两个操作数都是对象,则返回第一个操作数
  • 如果有有两个操作数是 null,则返回 null
  • 如果有有两个操作数是 NaN,则返回 NaN
  • 如果有有两个操作数是 undefined,则返回 undefined

关系操作符

小于(<)、大于(>)、小于等于(<=)、大于等于(>=)都是关系操作符,用于两个值比较,返回一个布尔值。

它遵循以下规则:

  • 如果两个操作数都是数值、则执行数值比较
  • 如果两个操作符都是字符串,则比较两个字符串对象的字符编码值
  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较
  • 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并得到结果根据前面的规则执行比较
  • 如果一个操作数是布尔值,则先将其转换为数值,然后进行比较

相等操作符

相等(==)表示如果两个操作数相等,则返回true。而不相等(!=)表示如果两个操作数不相等,则返回false。这两个操作符都会先转换操作数(强制类型转换),再进行比较。

它遵循以下基本规则:

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值(false -> 0, true -> 1)
  • 如果一个操作数是字符串,另一个操作数是数值,比较相等性之前先将字符串转换为数值
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本数值型按照前面的规则进行比较

操作数在比较时要遵循以下规则:

  • 要比较相等性之前,不能将nullundefined转换为其他任何值
  • 如果有一个操作数是NaN,则相等操作符返回false,不相等返回true提示:即使两个操作数都是NaN,相等操作符返回false
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true,否在,返回false

注意:全等操作符(===)和不全等(!==)操作符比较的是不转换之前的操作数