《JS运算符》

227 阅读2分钟

一、算数运算符

number 运算

  • 加减乘除 "+" "-" "*" "/"
    (除法不能除0,Infinity)
  • 余数 x % 7 (两个数字相隔7,除以7,余数相等 eg:10%7 = 17%7

但是JS中有一个错误,会忽略负数相除:eg:-1%7,会变成1%7进行运算,得出余数为-1,所以-1%7 === 6%7 值为false

  • 指数 x ** 3
  • 自增自减 x++ / ++x / x-- / --x 口诀:a在前 值为前,a在后值为后
var a = 1
a++ //1 返回a加之前的值
a //2 自身增加1
var a =1
++a  // 2 返回a加之后的值
a //2

尽量少用自增自减,容易记错a++ 可以写成 a+= 1

不同类型不要相加,JS不提示错误 eg:'1'+ 1

  • 求值运算符 +x
  • 负数运算符 -x
var a = 8
-a //-8 正数变负数
var a = -8
-a //8 负负得正

string 运算

  • 连接运算
'123' + '456'  //'123456'

二、比较运算符

> | < | >= | <=| ==(模糊相等) | !=(不等) | === (全等)| !==(不全等)

  • JS三位一体

永远不要使用'==',用'==='代替,‘==’会自动类型转换

'==='没有任何费解,基本类型看值是否相等,对象看地址是否相等.

[] !== []  //数组只能比较地址,不能比较内容
{} !== {}  
NaN !== NaN  //特例

image.png

三、布尔运算符

  • ||
  • &&
  • !
  • 短路逻辑
console && console.log && console.log('hi') 
// 以防 console 不存在报错,如果console存在,如果console.log也存在,就执行console.log(hi)

console?.log?('hi') //JS最新版本把以上代码的简写方式,可选链语法
a = a || 100  //a的保底值是100,但这种写法有bug
function add (n=0)   //最新语法把保底值写在参数中,解决了空判断失误的bug

四、二进制运算符

  • | 两个位都为0,则结果为0,否则为1
eg: (0b1111 | 0b 1010).toString(2)  //"1111"
  • & 两个位都为1,则结果为1,否则为0
eg: (0b1111 & 0b 1010).toString(2)  //"1010"
  • ~ 如果是1变成0,如果是0变成1,但是变了之后会以补码的形式翻译成负数

  • 异或 ^ 两个位相同,则结果为0,否则为1

eg: (0b0111 ^ 0b1010).toString(2) //"1101"
  • 左移右移 <<>>
eg: (0b0111 >> 1).toString(2) //"0011"
    (0b0101 << 1).toString(2) //"1010"
  • 头部补零的右移运算符 >>>

位运算运用

使用与&运算符判断奇偶

偶数 & 1 = 0; 奇数 & 1 = 1

eg: 123 & 1  //1
    124 & 1  //0

使用~, >>, <<, >>>,| 来取整

console.log(~~ 6.83)    // 6
console.log(6.83 >> 0)  // 6
console.log(6.83 << 0)  // 6
console.log(6.83 | 0)   // 6
console.log(6.83 >>> 0)   // 6
位运算会消除小数部分

使用^来交换 a b 的值

var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a)   // 8
console.log(b)   // 5

过程:

image.png JS新语法可以写成 [a,b] = [b,a],就能交换a b的值

五、其他运算符(奇葩)

点运算符

  • 语法 对象.属性名 = 属性值
  • 作用 读取/设置对象的属性值
  • 有个疑问 不是对象,为什么也可以有属性?'a-b-c'.split('-')

JS 有特殊逻辑,点前面不是对象,就把它封装成对象

number 会变成 Number 对象

string 会变成 String 对象

bool 会变成 Boolean 对象

程序员从来不用这三种对象,只用简单类型

var a = {name:'xxx'}
a.name //"xxx" 读取属性值
a.name = 'yyy'  //设置属性值

void运算符

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

逗号运算符

  • 语法 表达式1, 表达式2, ..., 表达式n
  • 作用 将表达式 n 的值作为整体的值
  • 使用
let a = (1,2,3,4,5)
//那么 a 的值就是 5,奇葩吧?
let f = (x) => (console.log('平方值为'), x*x)
//不用return,也能写出两句语句。先打印 后求值,注意上面的括号不能省

运算符优先级

  • 技巧 圆括号优先级最高,逗号最低,其他一律不记