04.运算符
运算符用来对一个或多个值进行运算并返回运算结果。比如,+就是一个运算符,用来求两个数的和。let a = 1 + 1
,变量的a的值是2。
算术运算符
算术运算符用来完成算术运算,功能和数学中的算术运算符功能一致。
- + 用于求两个数的和
- – 用于求两个数的差
- * 用于求两个数的积
- / 用于求两个数的商
- % 模运算,求两个数相除的余数
- ** 幂运算,x的y次幂运
注意:
- 算数运算时,
除了字符串加法
,其他运算操作数是非数值时,都会转换为数值然后再运算。 - 当任意一个值和字符串做加法运算时,它会先将其他值转换为字符串,然后再做拼串操作。
- 可以利用这一特点来完成类型转换(隐式),
任意类型 + 一个空串 = String类型
其原理和String()函数
相同,但用起来更方便。
字符串
//字符串加法-特殊
a = 1 + "1" // "1" + "1" = "11"
//字符串减法
a = 2 - "1" // 2 - 1 = 1
//字符串类型转换-隐式
a = 2 + "" // "2"
a = 1 + 1 // 2
a = true + false //1
a = 10 % 3 // 1
a = 2 ** 3 // 8
a = 10 / 3 //3.3333333333333335
a = 10 / 5 //2
js是一门弱类型语言,当进行运算时会通过自动的类型转换来完成运算
a = 10 - '5' //10-5
a = 10 + true //10+1
a = 5 + null //5+0
a= 6 - undefined //NaN
赋值运算符
- = 等号
- +=
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 ??=101
空赋值
let a = 11
a ??= 101 //a已经有值,且不为null和undefined,所以赋值无效
console.log(a) //11
let a = null
a = undefined
a ??= 101 //a为null和undefined,所以赋值有效
console.log(a) //101
注意:使用空赋值符号对变量进行赋值时,只有变量的值为null
或undefined
时才会发生赋值
一元的+和-
- + 一元的加,正号
- – 一元的减,负号
利用js的自动类型转换原理,±号也可以用来类型转换(隐式),效果和Number()函数
一样。
let a = '123'
a = +a //number 123
a = -a //number -123
console.log(typeof a, a)
自增和自减
- ++ 自增
- -- 自减
let a = 123
a + 10 //number 123,不赋值的情况下原数值a不会改变
a++ //number 124,自增、自减运算符会改变原数值a
console.log(typeof a, a)
注意:
- 自增会使变量立刻增加1,自增分为前自增
++a
和后自增a++
,前自增会在自增后返回新值,后自增会在自增以后返回旧值,自减同理。 a++
和++a
执行的结果都是在原数值a的基础上加一,区别在于返回值不同,一个返回旧值,一个返回新值。
let a = 123
console.log("a原来的值为:", a)//a原来的值为: 123
let b = a++
console.log("a自增后的值为:", a)//a自增后的值为: 124
console.log("a++的返回值为:", b)//a++的返回值为: 123
let a = 123
console.log("a原来的值为:", a)//a原来的值为: 123
let b = ++a
console.log("a自增后的值为:", a)//a自增后的值为: 124
console.log("++a的返回值为:", b)//a++的返回值为: 124
关系运算符
- > 大于
- >= 大于等于
- < 小于
- <= 小于等于
关系运算符和后边的相等运算符都用来比较两个值的关系是否成立,关系成立时返回true,否则返回false。
注意:
当对非数值进行关系运算时,它会先将字符串转换为数值然后再比较(前提必须有一个是数值类型)
当关系运算符的两端是两个字符串,它不会将字符串转换为数值,
而是逐位的比较字符的
Unicode编码
, 利用这个特点可以对字符串按照字母排序。
注意比较两个字符串格式的数字时一定要进行类型转换
1 < 5 // true
1 < '5' // true
'11' < '5' // true
比较非数值时,会先转换为数值然后比较。如果两侧的值都是字符串,则会逐位比较字符串的Unicode编码。
相等运算符
- == 相等运算符
- === 全等运算符
- != 不等运算符
- !== 不全等运算符
注意:
相等和不等运算符比较不同类型数据时,会转换为相同的类型进行比较(通常会转换为数字)。全等和不全等不会做类型转换。
null和undefined进行
==
比较时会返回trueNaN不和任何值相等,包括它自身
null和undefined进行
===
比较时会返回true1 == '1' // true
1 === '1' // false
逻辑运算符
- ! 逻辑非
- && 逻辑与
- || 逻辑或
注意:
逻辑与运算,在运算时会先检查第一个值是否是false,如果是false直接返回第一个,否则返回第二个。逻辑非正好相反,在运算时会先检查第一个值是否是true,如果是true则返回第一个,否则返回第二个。
&&逻辑与
- 可以对两个值进行与运算
- 当&&左右任意一边有false时,返回false,否则返回true
- 与运算时短路的与,如果第一个是false,则不看第二个值
- 与运算是直接找false的,如果找到false则直接返回,没有false才会返回true
- 对于
非布尔值进行与运算
,它会转换成布尔值然后运算,但是最终返回原值
如果第一个值为false
,则返回第一个值
如果第一个值为true
,则返回第二个值
| | 逻辑或
- 可以对两个值进行或运算
- 当 | | 左右任意一边有true时,返回true,否则返回false
- 与运算时短路的与,如果第一个是true,则不看第二个值
- 与运算是直接找true的,如果找到true则直接返回,没有true才会返回false
- 对于
非布尔值进行或运算
,它会转换成布尔值然后运算,但是最终返回原值
如果第一个值为true
,则返回第一个值
如果第一个值为false
,则返回第二个值
false && true // false
0 && true // 0
a = 1 && 2 // 2
true || false // true
1 || 2 // 1
条件运算符
- condition ? exprIfTrue : exprIfFalse 三元运算符
条件表达式 ?表达式1 :表达式2