JS 运算符

510 阅读4分钟

一.算术运算符

写在最前面: 不同数据类型请不要加起来,别整个1+'2'

  • number运算:
    1.加+减-乘*除/
    2.余数 x%3 (x除以3取余)
    3.指数 x**4 (x的4次方)
    4.自增自减 x++/++x/x--/--x (x在前,表达式的值取自增前的值;x在后,表达式的值取自增后的值)
    5.求值运算符 +x (不是取正的意思,就是求一下这个数的值)
    6.负数运算符号 -x (x取反)

  • string运算:
    连接运算'123'+'456'(+连接两个不同的字符串)
    字符串只支持连接运算符+ !

  • 那如果我非要number和string放一起运算呢?
    JS这种情况不会提示出错!
    1.数字字符串相加: JS会把数字转换成字符串再跟另外一个字符串相加,最终结果得到一个字符串.
    如: '1'+2 的结果为 "12" .
    2.数字字符串相减: JS会把字符串转换成数字再和另一个数字进行相减,最终结果得到一个数字.
    如: '2'-1 的结果为 1 .

  • 一个建议
    除了for循环, 其他情况尽量少用自增自减运算符, 可以用 x += 1或者 x-= 1 代替.

二.比较运算符

  • 各种普通的比较运算符: = > < >= <=
  • == 模糊相等 (不要用不要用不要用!!!可能会有类型转换的问题.)
  • === 全等于 (JS里只用这个全等于,不要用模糊相等; 基本类型看值是否相等,对象看地址是否相等)
  • != 不模糊相等
  • !== 不全等于 ([] !== [] 空数组不全等于空数组; {} !== {} 空对象不全等于空对象; NaN !== NaN)

三.布尔运算符

  • 或 且 非
    或: || (只要有一个true,就返回true)
    且: && (只要有一个false,就返回false)
    非: !
  • 短路逻辑
    1.console && console.log && console.log("hi!")
    ↑这种写法叫做防御性编程,以防console不存在报错,意思是:
    如果console存在,且console.log也存在,再执行console.log("hi!")
    2.a = a || 100 (a等于a或100)
    ↑这种写法使a的保底值为100, 意思是当a为真时a不变,a为假时a就等于100
    注意:当a为null或undefined时就不能这么写,要这么写function add(n=0){ return ... }

四.二进制位运算符

以下二进制运算符只对二进制数有效

  • 或 与 否
    或: | (两个二进制位垂直相比,有一位为1,则该位取1)
    与: & (两个二进制位垂直相比,两位都为1,则该位取1)
    否: ~

  • 异或
    异或: ^ (两个二进制位垂直相比,两个位相同,则该位取0;两个位不相同,则该位取1)

  • 左移右移
    左移: << (0b0010 << 1).toString(2) //二进制数0010左移一位,结果为"100"(省略了最前面的0)
    右移: >> (0b0011 >> 1).toString(2) //二进制数0011右移一位,结果为"1"(省略了前面三个0,最后一个1移出去了)

  • 头部补0的右移运算符
    头部补0的右移运算符: >>> (在二进制数为正时,这个跟上面的右移运算符是一样的)

以下是一些二进制运算符的神奇用法:

  • 用与运算符判断数的奇偶
    偶数 & 1 = 0
    奇数 & 1 = 1

  • 使用 ~ , >> , << , >>> , | 来取正
    上面五种效果都是一样的,结果都等于6.如:
    console.log(~~ 6.66) //注意是两个~
    console.log(>> 6.66)
    console.log(<< 6.66)
    console.log(>>> 6.66)
    console.log(| 6.66) //以上五种方法结果都为打印出6

  • 使用 ^ 交换两个值
    正常的写法是:

let a=5
let b=7
[a,b]=[b,a] //就这么简单
//此时a值为7,b值为5

非要用运算符交换的写法是:

let a=5
let b=7
a ^= b //其实是a = a ^ b的缩写
b ^= a
a ^= b //用这三行实现交换
//此时a值为7,b值为5

五.其他运算符

  • 点运算符
    基本语法: 对象.属性名 = 属性值
    作用:读取对象的属性值
    注意:点运算符只可以用在对象上, 如果不是对象那么JS会封装成对象

  • void 运算符 基本语法: void 表达式或(语句)
    作用:如果后面是表达式就求表达式的值,如果后面是语句就执行这个语句,然后得到一个undefined 注意:return 假值 可以阻止默认动作

  • 逗号运算符
    基本语法:表达式1, 表达式2, ...,表达式n
    注意:let a = (1,2,3,4,5) //a的值为5.取最后一个表达式的值
    用法如:let f = (x) => (console.log("hi"),x+x) //计算x+x的同时打印hi