【JS】JS运算符

762 阅读7分钟

一、算术运算符

(一)数值的运算

1、加法运算符+

2、减法运算符-

3、乘法运算符*

4、除法运算符/

5、余数运算符%

  • 运算结果的正负号由第一个运算子的正负号决定。把第一个运算子的正负号先提出来,算好之后再加上去。
  • 上述的是js的规则,其实是错误的。正确的应该是(-1+7)% 7 // 6,但是没办法。跟着js的规则来吧
1 % 7 // 1
-1 % 7 // -1
1 % -7 // 1

6、指数运算符**

指数运算符(**)完成指数运算,前一个运算子是底数,后一个运算子是指数。

2 ** 4 // 16

注意,指数运算符是右结合,而不是左结合。即多个指数运算符连用时,先进行最右边的计算。

// 相当于 2 ** (3 ** 2)
2 ** 3 ** 2
// 512

7、自增自减运算符

  • x++ :这个表达式的值为x,最后返回x+1
  • ++x :这个表达式的值为x+1,最后返回x+1
  • x-- :这个表达式的值为x,最后返回x-1
  • --x :这个表达式的值为x-1,最后返回x-1

(1)规则:x在运算符号前,值为前;x在运算符号后,值为后

let a =10
let b = a++
b //10

(2)只在for循环中用自增自减运算符。因为所有人都可能弄错值

(3)其余时候用x+=1(也就是x=x+1的简写)

8、求值运算符+x

求值运算符的作用在于可以将任何值转为数值(与Number函数的作用相同)。

+(-1)// -1
+true // 1
+[] // 0
+{} // NaN

9、负数运算符-x

负数运算符,也同样具有将一个值转为数值的功能,只不过得到的值正负相反。连用两个负数值运算符,等同于数值运算符。

-(-1)// 1
-true // -1
-[] // -0
-{} // NaN

(二)字符串的运算

1、连接运算+

'123'+'456' //"123456"

(三)忠告

不同类型的数据不要加起来。就像人和猪加起来是啥???

  • +号运算符默认把所有运算子变成字符串然后运算
  • -号运算符默认把所有运算子变成数值然后运算
1 +'2' //"12"
2-'1'  // 1

二、比较运算符

  • > 大于运算符
  • <小于运算符
  • <=小于或等于运算符
  • >=大于或等于运算符
  • ==模糊相等运算符
  • ===严格相等运算符
  • !=模糊不相等运算符
  • !==严格不相等运算符

1、永远不要用==模糊相等运算符

因为他总是自动类型转换。转的人心累。 所以我不想学。

上面为JS三位一体图

//0模糊相等于这些
0 == [] //true
0 == '0' //true
0 == '\t' //true

//但是,右边三个却不模糊相等!!

2、只使用===严格相等运算符

如何判断x === y是true还是false

  • 第一步:看x与y的数据类型。类型不同就是false
  • 第二步:类型相同的话

①如果类型是对象,看保存的地址是否相同

②如果类型不是对象,看值是否相等

但注意**NaN !== NaN**

下图为x===y真值表

三、布尔运算符

(一)或运算符||

短路逻辑,详见【JS】JS语法

(二)且运算符&&

短路逻辑,详见【JS】JS语法

(三)非运算符!

  1. 将布尔值变为相反值,即true变成false,false变成true。

  2. 对于非布尔值,取反运算符会将其转为布尔值。比如把五个被认为是false的值变成true,其余的都变成false

  3. 综上所述,非运算符!把以下六个变成true,其余类型的值都变成false

  • false
  • undefined
  • null
  • 0
  • NaN
  • 空字符串(''

4、所以不管x是什么类型的值,经过两次取反运算后,变成了与Boolean函数结果相同的布尔值。所以,两次取反就是将一个值转为布尔值的简便写法。

!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true

!54 // false
!'hello' // false
![] // false
!{} // false

!!x
// 等同于
Boolean(x)

(四)三元运算符:?:

详见【JS】JS语法

四、二进制位运算符(工作根本用不上,面试才会用)

(一)或运算符(or)

  • 符号为|,表示若两个二进制位都为0,则结果为0,否则为1。

(二)与运算符(and)

  • 符号为&,表示若两个二进制位都为1,则结果为1,否则为0。
(0b1010|0b1111).toString(2) // "1111"
(0b1010&0b1111).toString(2)  // "1010"

(三)否运算符(not):

  • 符号为~,表示对一个二进制位取反。
  • 它的返回结果有时比较难理解,因为涉及到计算机内部的数值表示机制。别管了

(四)异或运算符(xor):

  • 符号为^,表示若两个二进制位不相同,则结果为1,否则为0。

(五)左移运算符(left shift):

  • 符号为<<,表示将一个数的二进制值整体向左移动指定的位数,前面的数字会被吃掉。

(六)右移运算符(right shift):

  • 符号为>>,表示将一个数的二进制值整体向右移动指定的位数,后面的数字会被吃掉
  • 如果是正数,头部全部补0;如果是负数,头部全部补1。
(0b0010 >> 1).toString(2)
//"1"//0001
(0b0010 << 1).toString(2)
//"100"//0100
(0b0011 >> 1).toString(2)
//"1"//0001
(0b0011 << 1).toString(2)
//"110"//0110

(七)头部补零的右移运算符(zero filled right shift):

  • 符号为>>>,二进制为正数时,和右移运算符>>无区别

面试专栏

1、和1做二进制与运算判断奇偶性

(1)一个数除以二的余数是1,就是奇数

7 % 2 === 1//true

(2)一个二进制数如果最后一位数是1则他就是奇数。

(3)因此,把一个数与1(0b0001)做二进制与运算。如果该数为奇数(二进制最后一位为1),那么运算结果一定是1。如果该数为偶数(二进制最后一位为0),那么结果一定是0

7 & 1
//1
//(0b111 & 0b001).toString(2)
6 & 1
//0
//(0b110 & 0b001).toString(2)

2、使用~,>>,<<, >>>,来取整

位运算抹除小数

console.1og(~~ 6.83)
// 6
console.1og(6.83 >> 0)
// 6
console.log(6.83 << 0)
// 6
console. log(6.83 | 0)
// 6
console.1og(6.83 >>> 0)
// 6

3、使用^来交换a、b的值

var a = 5 //0101
var b = 8 //1000

//方法一
a ^= b  //a = a ^ b //0010
b ^= a  //b = b ^ a//0101
a ^= b  //a = a ^ b//1000
console. log(a)
// 8
console.log(b)
// 5


//方法二:面试官就是不让你用这个简单的方法
[a,b] = [b,a]

五、其他运算符

(一)点运算符

  1. 语法:对象.属性名=属性值

  2. 作用:读取或者设置对象的属性值

  3. 不是对象,为什么也可以有属性?

  • 'a-b-c'split("-')
  • JS有特殊逻辑,点前面不是对象,就把它封装成对象,这些封装对象会指向对应的原型,原型会有属性
  • number会变成Number对象
  • string会变成String对象
  • bool会变成Boolean对象
  • 用完封装对象,就立即把这个封装对象从Heap堆里删掉
  • 程序员从来不用这三种对象,只用简单类型

(二)void运算符

  1. 语法:void 表达式或语句

  2. 作用

  • 求表达式的值,或执行语句
  • 然后void的值总是为undefined
  1. 需求
<a href="http://example.com" onclick="f(); return false;">点击</a>
//return假值可以阻止默认动作
<a href="javascript: void(f())">文字</a>
//改用void可以炫技

(三)逗号运算符

  1. 语法: 表达式1,表达式2,...,表达式3
  2. 作用:将表达式n的值作为整体的值
  3. 使用
let a = (1,2,3,4,5)
a // 5


let f = (x,y) => (console.log('Hi'),x+y)
//等价于
let f = (x,y) => {console.log('Hi') return x+y}

六、不要学运算符优先级

  1. 圆括号优先级最高
  2. 其他的你想先算谁你用圆括号包起来就完事
  3. 剩下的我就不知道了,因为没有人能记住。就算我不吃不喝最后把这些记住了,我的同事他们不理解我的代码顶个吊用?
  4. 相同运算符 从左到右a+b+c 从右到左a=b=c=d