JS运算符

446 阅读4分钟

目录

  • 算术运算符
  • 比较运算符
  • 布尔运算符
  • 二进制位运算符
  • 其他运算符

算术运算符——数学运算

number运算

  • 加减乘除
  • 余数:x%7
  • 指数:x**3
  • 自增自减:x++ / ++x / x-- / --x
  • 求值运算符:+x
  • 负数运算符:-x

string运算

  • 连接运算:'123'+'456'

尽量少用自增自减——因为容易你和别人都记错

  • 只在一个地方用,就是for循环

不同类型不要加起来——把1和'2'加起来是几个意思?

比较运算符

  • <
  • =

  • <=
  • ==
  • !=
  • ===(读作全等)
  • !==

JS三位一体

  • 0 == []
  • 0 == '0'
  • 0 == '\t'
  • 但是右边三个互不相等
  • 忠告:永远不要使用==,用===代替。==的问题在于,它总是自作聪明(自动类型转换)
  • x==y真值表,令人难以理解,听我一劝,永远不要用两个等于号

x===y真值表,没有任何费解:

  • 基本类型看值是否相等
  • 对象看地址是否相等
  • [] !== []
  • {} !== {}
  • 对象是比较地址的,不是比较内容
  • NaN!==NaN,唯一特例,强行记忆一下

布尔运算符

或且非

  • ||
  • &&
  • !

短路逻辑

  • console&&console.log&&console.log('hi')
  • 以防console不存在报错,这叫防御性编程
  • console?.log?('hi'),叫可选链语法,等价于上面的语法,但这个语法要明年才能用
  • a=a||100
  • a的保底值
  • 但是a=a||100是有bug,最好用最新的语法
function add(n){
  n=n||0
  return n+1
}

等价于:

function add(n=0){
  return n+1
}

最好是用下面这种,最新的语法

二进制运算符

或、与、否

  • |两个位都为0,则结果为0,否则为1
  • &
  • ~

异或

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

左移右移

  • <<和>>

头部补零的右移运算符

平时工作基本不会用,面试喜欢问。下面这些都是面试官逼我们要学的

使用与运算符判断奇偶

代码

  • 偶数 & 1 = 0
  • 奇数 & 1 = 1

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

代码

  • 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

上面的为了应付面试官,记一下就行了。现在最新语法交换a b的值是这样写的:

var a = 5;var b = 8;
[a,b]=[b,a]

位运算用得很少容易忘,面试之前重新看看这三个题即可

其他运算符——一个比一个奇葩

点运算符

语法

  • 对象.属性名=属性值

作用

  • 读取对象的属性值

有个疑问

  • 不是对象,为什么也可以有属性?'a-b-c'.split('-')
  • JS有特殊逻辑,点前面不是对象,就把它封装成对象
  • number会变成Number对象
  • string会变成String对象
  • bool会变成Boolean对象
  • 程序员从来不用这三种对象,只用简单类型。new Number(),你这辈子都不要用,== ++也不要用,++只在for循环的时候用。

void运算符

语法

  • void表达式或语句

作用

  • 求表达式的值,或执行语句
  • 然后void的值总是位undefined。void的唯一目的就是得到一个undefined

需求

<a href="http://example.com" onclick="f();return false;">点击</a>
  • return 假值可以阻止默认动作
<a href="javascript:void(f())">文字</a>

等价于

<a href="javascript:;">文字</a>
  • 如果你希望有一个a标签又不希望它有任何动作,就这样写。但是用void可以炫技

逗号运算符

语法

  • 表达式1,表达式2,…,表达式n

作用

  • 将表达式n的值作为整体的值

使用

  • let a = (1,2,3,4,5)
  • 那么a的值就是5,奇葩吧?
  • let f=(x)=>(console.log('平方值为'),x*x)
  • 这么写就不用写return了,但注意两个表达式外面的括号不能省