JavaScript运算符

484 阅读6分钟

number运算

  • +-*/ 其中除法不能除以0,例如 7/0Infinity
  • 余数 (x % 7) JS中负数有特殊情况,例外-1 % 7-1,先执行1%7,再添加-到结果前面
  • 指数 x ** 3 例如3 ** 2意思是32次方为9
  • 自增x++ / ++x自减x-- / --x 其中,自增的情况下,a在前,加a之前的值,a在后,加a之后的值。自减的情况和自加一样。
var a = 1;
a++ // 1   a++的值是a在运算加符号之前的值
a // 2

var a = 1
++a // 2  ++a的值是a在运算加符号之后的值
a // 2
  • 求值运算符+x
let a = 8
+a // 8 其中+运算符不是加的意思,是指求a的值的意思
  • 负数运算符+x
let a = -8
-a // 8 其中-运算符意思是把求得值转为相反的正负数

string运算

连接运算'123'+'456', 字符串中,只有+支持string运算

'1'+'2' // '12'

例如情况JS中,数字和字符串相加,会将数字转化为字符串,在进行连接。这是例外情况,在其他语言中会报错,只有Js会有这种奇葩情况

1 + '2' // "12"

JS中,数字和字符串相减,会将字符串转化为数字,在进行想减。这是例外情况,在其他语言中会报错,只有Js会有这种奇葩情况

2 - '1' // 1

注意事项

  • 尽量少用自增自减,让自己和别人都能理解你的代码
  • 不要把不同类型的数据加起来,例如1+'2'

比较运算符

  • >
  • <
  • >=
  • <=
  • ==
  • ===
  • !=
  • !==

注意事项1: JS 三位一体

永远不要使用==,使用===代替,因为==总是会自动进行类型转换

0 === []
0 === '0'
0 === '\t'

// 但是右边三个互相不相等
[] === '0' // false
'\t' === '0' // false

注意事项2: x == y真值表

十分的令人费解

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

注意事项3: x === y真值表

完全理解

  • 基本类型看值是不是相等
  • 对象看地址是否相等
[]! == [] // 空数组不等于空数组
{}! == {} // 空对象不等于空对象

唯一的特例NaN! == NaN

布尔运算符

或且非

  • ||
  • &&
  • !

短路逻辑

  • console && console.log && console.log('hi'),这样做的目的是,以防console不存在,报错。这种方法叫做'防御性编程',防止出错。
  • a == a || 100,a的保底值为100,为了防止a的为falsey值,可以使用以下写法
function add(n=0){
    return n+1
}

或与否

只对二进制有效

Ob11 // b后面的为二进制11,十进制为3
ob1111 | ob1010 // 依然为十进制的15
(ob1111  | 0b1010).toString(2) // 其中两两比较,有1就是1,否则为0, 转化为字符串后才显示二进制为"1111"
(ob1111  & 0b1010).toString(2) // 其中两两比较,两个都是1就是1,否则为0, 转化为字符串后才显示二进制为"1010"
(~ob1111).toString(2) // 其中1转为0,0转为1,转化为字符串后才显示二进制位"-10000"

异或

(0b1111 ^ 0b1010).toString(2) // 其中两两比较,相同则为0,否则为1,转化为字符串后才显示二进制位"0101",省略0则为"101"

左移<<和右移>>

(ob0010 >> 1).toString(2) // 将其中的数字右移1位,则为0b0001,转化为字符串后才显示二进制位"1"
(ob0011 >> 1).toString(2) // 将其中的数字右移1位,则为0b0001,把最右边的1吃掉,转化为字符串后才显示二进制位"1"
(ob0010 << 1).toString(2) // 将其中的数字左移1位,则为0b0100,转化为字符串后才显示二进制位"100"
(ob0011 << 1).toString(2) // 将其中的数字左移1位,则为0b0110,右边的为自动补全的0,转化为字符串后才显示二进制位"100"

头部补零的右移运算符 >>>

(ob1011 >>> 1).toString(2) // 将其中的数字左移1位,则为0b0101,左边的为自动补全的0,转化为字符串后才显示二进制位"101"

练习题目

问题1: 使用与运算符判断奇偶

让任意数字和二进制的1进行与运算,就得到结果,得出奇偶

方法:
7 % 2 === 1 // 奇数
7 & 0b001 = 1 // 奇数,如果7和二进制的1相等,则7为奇数

问题2:使用~,>>,<<,>>>, 来取整

console.log(~~ 6.83)  // 6,两次取反,去除小数
console.log(6.83 >> 0) // 6, 右移一位,去除小数
console.log(6.86 << 0) // 6, 左移一位,去除小数
console.log(6.83 | 0) // 6, 得到自身,去除小数
console.log(6.83 >>> 0) // 6, 头部补零的右移运算符,去除小数 

问题3: 使用^来交换ab的值

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

点符号

语法

对象.属性名 = 属性值

作用

读取对象的属性值

注意事项

如果不是对象,JS会把它封装成对象,number会变成number对象,string会变成string对象,bool会变成Boolean对象, 但是程序员从不使用这三种对象,只用简单类型

let a = 1 
a.toString()  // "1". a使用toString()方法后,变回数字。
a.toString()  // 会报错

void运算符

语法

void表达式或语句

作用

求表达式的值,或执行语句。然后void的值总是为undefined

void console.log('hi') // hi, undefined
void 1 // undefined
void (1+1) // undefined

需求

<a href="http://example.com" onclick="f();return false;">点击</a>

设置return为假值,可以阻止默认动作,比如点击网页,阻止它跳转到网页地址

<a href="javascript: void(f())">文字</a>

这里也阻止了默认动作,和上面的是一样的作用

点运算符

语法

表达式1,表达式2,...表达式n

作用

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

作用

var a = (1,2) // a的值为2
(1,2,3,4)    // 4

// 在这里,执行console.log语句,不写return,把x+1作为语句的返回值
let  f = x =>(console.log('hi'), x+1)
f(1)
// hi
// 2

运算符优先级

不同运算符

  • 1 + 2 * 3 先算乘ji法,再算加法,结果为7
  • !a === 1
  • new Person().sayHi()

相同运算符

  • a+b+c从左到右计算
  • a = b = c = d 从右到左赋值

优先级汇总

  • 圆括号优先级最高

面试技巧

坦言不记优先级,因为优先级太多了,需要很多时间来记忆难,就算我记好了,也不确定我的同事能把这些给记好,但是我会记得圆括号里的优先级最高,工作中需要运算符的话,我可以到时候再查找。

更多信息

位运算符在JS中的妙用

运算符优先级 MDN