【JS】JS运算符

246 阅读5分钟

一、算数运算符

number运算符

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 == [] //true
  • 0 == '0' //true
  • 0 == '\t' //true
  • 但是,右边三个却不模糊相等 **忠告: 永远不要使用==,用===代替

==的问题在于,它总是自作聪明(自动类型转换)

2.x==y真值表

令人难以理解

  • []==false但不是falsy
  • []==false{}却不是
  • [[]]==false

3.x===y真值表

没有任何费解

  • 基本类型看值是否相等
  • 对象看地址是否相等 但是
  • [] != []
  • {} != {} 唯一特例,强行记忆
  • NaN == NaN

布尔运算符

1.或且非

  • ||
  • &&
  • !

2.短路逻辑

  • console&&console.log&&console.log('hi')
  • 以防console不存在报错
  • a = a || 100
  • a的保底值 详细内容【JS】JS语法

#二进制运算符

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

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

  • 符号~,表示对一个二进制位取反。

异或

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

左移运算符(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

头部补零的右移运算符

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

参考资料: 位运算符在JS中的妙用

面试题

使用与运算符判断奇偶

代码

  • 偶数 & 1 = 0
  • 奇数 & 1 = 1 举例
7 & 1
//1
//(0b111 & 0b001).toString(2)
6 & 1
//0
//(0b110 & 0b001).toString(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

使用^来交换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]

其他运算符

点运算符

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

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

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

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

void运算符

语法:void 表达式或语句

作用:

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

逗号运算符

  • 语法: 表达式1,表达式2,...,表达式3
  • 作用:将表达式n的值作为整体的值
  • 使用:
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}

运算符优先级

  • 圆括号优先级最高
  • 其他资料:运算符优先级
  • 相同运算符 从左到右a+b+c, 从右到左a=b=c=d