一、算数运算符
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+1x--
:这个表达式的值为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