持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
1️、前言
大家好,我是翼同学。今天笔记的内容是:
- 运算符总结
2️、内容
2.1、算术运算符
(1) 基本算术运算符
基本算术运算符有五个,分别是:
- 加法运算符
+ - 减法运算符
- - 乘法运算符
* - 除法运算符
/ - 求余运算符
%
这五个运算符都会将操作数转换为数字,并进行求和、求差、求积、求商以及求余数的操作。当然,如果操作数无法转换为数字,则会转换为NaN值,此时运算结果也是NaN值。
另外,加法运算符不止可以进行加法操作,也能连接两个字符串。还有一些其他情况则会进行适当的类型转换操作。
举几个例子:
1 + 1 //=> 2
"1" + "1" //=> "11"
"1" + 1 //=> "11"
true + true //=> 2
1 + null //=> 1
1 + undefined //=> NaN
1 + {} //=> "1[object Object]"
(2) 一元算术运算符
+:一元加法运算符可以将操作数转换为数字(或者NaN)并-:一元减法运算符会先将操作数转换为数字,再改变其符号并返回;++:递增运算符可对操作数进行加一操作。也就是将操作数转换为数字并增1;--:递减运算符可对操作数进行减一操作。也就是将操作数转换为数字并减1;
另外,递增运算符和递减运算符的返回值会根据其相对于操作数的位置而不同。当递增运算符位于操作数之前,则操作数会增1并返回自增结果;如果递增运算符置于操作数之后,此时虽然也会进行加一操作,但是返回的却是加1之前的值。递减运算符也一样。
(3) 位运算符
位运算符对于整数的二进制数据进行按位运算,具体如下:
&:按位与,当两个操作数的二进制数据上相对应的位都是1,结果位才是1;|:按位或,只要两个操作数的二进制数据相对应的位上有一个为1,结果位就是1;^:按位异或,当两个操作数的二进制数据相对应的位上不同时为1,结果位就是1;~:按位非,~属于一元运算符,运算过程是将操作数的所有位都取反;<<:按位左移,将操作数的所有二进制位进行左移操作,左移位数的范围在0至31之间,将一个值左移一位的效果就相当于乘以2,左移两位就是乘以4,以此类推;>>:有符号按位右移,将操作数的所有二进制位进行右移操作,右移位数的范围在0至31之间,将一个值右移一位的效果就相当于除以2,右移两位就是除以4,以此类推;>>>:无符号按位右移,该运算符也是进行右移操作,与>>的不同点在于,>>>运算符在操作时左边最高位总是填补0,但>>在操作时左边最高位与原来操作数的符号有关,以保证运算结果的符号与原操作数一致。
2.2、赋值运算符
(1) =
在JavaScript中,我们使用赋值运算符=来将值赋给变量或属性。
举个例子:
let data = 666; // 将变量data赋值为 666
op.x = 58; // 将对象op的属性x设置为 58
c = b = a = 0; // 把三个变量都初始化为 0
需要注意,赋值运算符的左操作数必须是一个变量或者对象属性。而右操作数就可以是任意类型的值。
另外需要注意,=运算符的优先级较低,必要时会加上圆括号以保证运算的正确性。
(2) 赋值简写
在JavaScript中,可以将赋值运算符和其他运算符连接起来,组成一种快捷赋值方式。
现部分记录如下:
a += b; //=> a = a + b;
a -= b; //=> a = a - b;
a *= b; //=> a = a * b;
a /= b; //=> a = a / b;
a %= b; //=> a = a % b;
a &= b; //=> a = a & b;
a |= b; //=> a = a | b;
a ^= b; //=> a = a ^ b;
a <<= b; //=> a = a << b;
a >>= b; //=> a = a >> b;
a >>>= b; //=> a = a >>> b;
2.3、关系运算符
关系运算符又称比较运算符,是对两个数据进行比较时所使用的运算符,运算后会返回一个布尔值(true或false)作为比较结果。通常在if、while、以及for语句中会使用该运算符。
| 关系运算符 | 含义 |
|---|---|
< | 是否小于 |
> | 是否大于 |
>= | 是否大于等于 |
<= | 是否小于等于 |
== | 是否相等(注意会隐式转换) |
!= | 是否不等 |
=== | 是否全等(严格等于) |
!== | 是否不全等(严格判断) |
注意,==和===的区别:
==运算符用于判断两个操作数是否相等,比较时会进行类型转换,比如18=='18'的返回结果是true.===运算符用于检测两个操作数是否严格相等,有时也称为恒等运算符,比如18==='18'的返回结果是false.
2.4、逻辑运算符
逻辑运算符就是用于进行布尔值运算的运算符,其返回值也是布尔值,经常用于多条件判断语句。
| 逻辑运算符 | 含义 | ||
|---|---|---|---|
&& | 逻辑与 | ||
| ` | ` | 逻辑或 | |
! | 逻辑非 |
逻辑运算符将多个关系表达式组合起来变成一个更加复杂的表达式。
(1) &&
记录:
- 逻辑与运算符
&&用于对两个值进行布尔与操作,即AND. - 只有两个操作数都是真值时,返回结果才是真值.
- 只要有一个操作数为假值,则返回结果就是假值.
(2) ||
记录:
- 逻辑或运算符
||用于对两个值进行布尔或操作,即OR. - 如果其中一个操作数为真值或者两个值都为真值,则返回结果为真.
- 如果两个操作数都是假值,则一定返回假值.
(3) !
记录:
- 逻辑非运算符
!是一元运算符,它放置在一个单独的操作数之前,用于求反 - 如果操作数是真值,则运算后返回假值
- 如果操作数是假值,则运算后返回真值
注意,!运算符的运算步骤是先将操作数转换为布尔值,再对该布尔值进行求反,也就是说,!运算符的运算结果一定是true或者false。因此我们可以通过使用两次逻辑非运算符来获得一个值的等价布尔值。
另外,布尔值的优先级较高,现记录两条恒等式:
!(p && q) === !p || !q
!(p || q) === !p && !q
(4) 短路
对于逻辑与和逻辑或这两个运算,都会有短路行为,即short circuiting。
怎么理解短路?短路运算的原理是,当逻辑运算符有多个表达式参与时,会从左到右依次确定,当运算可以确定结果时,就不再继续执行右边的表达式。
下面我们来看具体的介绍。
逻辑与短路
表达式1 && 表达式2
上述语法中:
- 如果表达式1的值为真,则返回表达式2.
- 如果表达式1的值为假,则返回表达式1.
举个例子:
let o = null;
o && o.a // null
在上面的例子中,&&并不会去计算右操作数,这是因为已经确定左操作数o为假值。此时就不会去计算p.a。
再举个例子:
(x == y) && myFunc();
上述语句中,只有当x等于y时,才会调用函数myFunc().
逻辑或短路
对于逻辑或运算来说,右侧表达式也有可能会不执行。其短路运算如下:
表达式1 || 表达式2
上述语法中:
- 如果表达式1的值为真,则返回表达式1.
- 如果表达式1的值为假,则返回表达式2.
举个例子:
let maxSize = x || y || 100;
上述例子中,如果变量x已经定义,则将其赋值给maxSize,否则就使用变量y。如果y也没有定义,则最后使用常量500来初始化变量maxSize。因此||运算符可用来从一组备用表达式中选取一个真值表达式。
2.5、其他运算符
(1) ? :
条件运算符? :是JavaScript中唯一的三元运算符,即有三个操作数。
语法如下:
操作数1 ? 操作数2 : 操作数3
在上述语法中,条件运算符?:的用法为:将操作数1当做布尔值,如果为真,则计算操作数2并返回计算结果;如果操作数1为假,则计算操作数3并返回结果。
也就是说,操作数2和操作数3一定会有一个被计算并返回结果,但不可能同时执行。其实条件运算符就是简化版的if语句,只不过使用条件运算符会更加简洁。
(2) delete
delete运算符从对象中删除属性。如果属性的值是一个对象,并且没有对该对象的更多引用,则该属性所持有的对象最终将自动释放。
delete运算符属于一元运算符,用于删除数组元素或者对象属性,也就是用于删除操作。
一般来说,delete运算符的操作数都是左值,此时delete运算符删除指定的左值并返回ture,如果操作数不是左值,delete运算符就不会进行任何操作,并返回true。
需要注意:
- 内置核心属性和客户端属性不能删除;
- 通过
var语句声明的变量也不能删除; - 通过
function语句定义的函数和函数参数也不能删除。
在非严格模式下,这些delete操作都不会报错,只是返回false来表明操作数不能执行删除操作。
(3) typeof
typeof运算符属于一元运算符,可置于操作数之前,用于返回操作数的类型。
现记录任意值在typeof运算后的返回值:
"number" //=> 任意数字 或 NaN
"string" //=> 任意字符串
"function" //=> 任意函数
"object" //=> null 或 任意内置对象(非函数)
"boolean" //=> true 或 false
"undefined" //=> undefined
typeof运算符一般用于条件语句中,比如:
if(typeof x == "string") {
...
}
另外,typeof运算符也可以加上圆括号typeof(),看起来有点像函数。
3️、写在最后
好了,今天的笔记就记到这里。