4、运算符
运算符也被称为操作符,用于实现赋值、比较和执行算数运算等功能的符号
js中常用的运算符有:
- 算术运算符
- 递增和递减运算符
- 比较运算符
- 逻辑运算符
- 赋值运算符
4.1 算术运算符
算术运算符用于执行两个变量或值的算术运算
常见的有我们熟悉的:+
(加)、-
(减)、*
(乘)、/
(除),还有个取余 %
4.2 浮点数精度的问题
浮点数的最高精度是17位小数,所以在进行算术计算时,其精度远远不如整数
所以,有一个很经典的题目:0.1 + 0.2 为什么不等于 0.3
因为js引擎执行代码的时候,需要转换为二进制的形式,但是0.1 和 0.2 的二进制浮点数并不十分精确,它们相加的接近于 0.30000000000000004 (17位小数),所以 0.1 + 0.2 != 0.3
那么有什么方法来判断0.1 + 0.2 = 0.3 呢?
最常见的方法是设置一个误差范围值,通常称为“机器精度”,这个值通常是2^-52
从ES6开始,该值被定义在Number.EPSILON
中,我们可以直接拿来用。所以可以使用 Number.EPSILON
来比较两个数字是否相等
function numberIsEqual(n1, n2) {
return Math.abs(n2 - n1) < Number.EPSILON;
}
var a = 0.1 + 0.2
var b = 0.3
console.log(numberIsEqual(a, b));
4.3 递增和递减运算符
如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减(–)运算符来完成
在js中,递增(++)和递减(–)既可以放在变量前面,也可以放在变量后面。放在变量前面时,我们称之为前置递增(递减)运算符;放在变量后面时,我们称之为后置递增(递减)运算符
注意:递增和递减运算符必须和变量配合使用
1、前置递增运算符
++num
等价于 num = num + 1
var num = 10;
console.log(++num); // 11
console.log(++num + 10); // 2
先自加,再返回,递减也一样
2、后置递减运算符
num++
类似于 num = num + 1
,单独使用时,++num
和 num++
效果一样
var num = 10;
num++;
console.log(num++); // 11,单独使用,跟++num无区别
var num1 = 10;
console.log(num1++ + 10); // 20, 先返回
console.log(num1); // 11 , 再加1
先返回,再自加,递减也一样
4.4 比较运算符
比较运算符(关系运算符)用于两个数据进行比较,返回一个布尔值 true/false
比较运算符 | 说明 | 案例 | 结果 |
---|---|---|---|
> 、 < | 大于号、小于号 | 2>1、1<2 | true |
>= 、 <= | 大于等于号、小于等于号 | 2>=2、2<=2 | true |
== | 判断号(会转型) | 18 == 18、18 == ‘18’ | true |
!= | 不等号 | 18 != 18 | false |
=== 、!== | 全等 要求 值 和 数据类型 都一样 | 18 === ‘18’ | false |
==
判断运算符会将数据转型,如:1 == '1'
,会将右边的字符串转化为数字型,最终返回true
当判断的时候,能用
===
就别用==
,让js引擎直接判断是否全等,提高性能
4.5 逻辑运算
逻辑运算符是用来进行布尔值运算的运算符,其返回值是布尔值,后面开发中经常用于多个条件的判断
逻辑运算符 | 说明 | 案例 |
---|---|---|
&& | “逻辑与”,简称“与” and | true && false |
|| | “逻辑或”,简称“或” and | true || false |
! | “逻辑非”, 简称“非” not | !true |
1、与运算
- 语法:表达式1 && 表达式2
- 如果第一个表达式1为真,就返回表达式2
- 如果第一个表达式1为假,就返回表达式1
console.log(123 && 456); // 第一个值为真,故返回 456
console.log(0 && 1); // 0
console.log(1 && 1 + 2 * 3); // 7(涉及运算符优先级)
console.log(0 && 1 && 2+3 && 2*3); // 直接返回0
console.log('' && 1); // 返回空的
console.log(null && 1); // null
console.log(undefined && 1); // undefined
console.log(NaN && 1); // NaN
2、或运算
- 语法:表达式1 && 表达式2
- 如果第一个表达式1的值为真,则返回表达式1
- 如果第一个表达式1的值为假,则返回表达式2
console.log(123 || 456); // 第一个值为真,故返回 123
console.log(0 || 1); // 1
console.log(1 || 1 + 2 * 3); // 1
console.log(0 || 1 || 2 + 3 || 2 * 3); // 1
console.log('' || 1); // 1
console.log(null || 1); // 1
console.log(undefined || 1); // 1
console.log(NaN || 1); // 1
注意:
var num = 0;
console.log(123 || num++);
console.log(num); // 0
- 第一个表达式为真,就返回123,后面不再执行,所以num为0
4.6 赋值元素符
用来把数据赋值给变量的运算符
赋值运算符 | 说明 | 案例 |
---|---|---|
= | 直接赋值 | var x = 1; |
+=、 -= | 加、减一个数 后赋值 | var age = 10; age += 5; //15 |
*=、 /=、 %= | 乘、除、取余、 后在赋值 | var age = 2; age *= 5; //10 |
// 取余 后赋值
var age = 5
age %= 2;
console.log(age); // 1
4.7 运算符优先级
优先级 | 运算符 | 顺序 |
---|---|---|
1 | 小括号 | () |
2 | 一元运算符 | ++、–、! |
3 | 算数运算符 | 先 * / % 后 + - |
4 | 关系运算符 | >、>=、<、<= |
5 | 相等运算符 | == 、!= 、=== 、!== |
6 | 逻辑运算符 | 先 && 后 || |
7 | 赋值运算符 | = |
8 | 逗号运算符 | , |
- 一元运算符里面的逻辑非
!
优先级比其他两个都要高 - 逻辑与 比 逻辑或 优先级高