module1-03-操作符
-
表达式:包含操作数和操作符,表达式会得到一个结果
一、算符运算符号
1.1 基本介绍
-
+(加) -(减) *(乘) /(除) %(取余) ()(括号)
-
1.2 非正常情况运算1
-
即有特殊字面量参与的运算
-
NaN参与的运算
-
得到的结果都是NaN
-
-
Infinity参与的运算结果视情况而定
-
以另外一个Infinity抵消自己或者取余都会得到NaN,其它都是本身
-
任何数 / Infinity都为0
-
任何数 % Infinity都是其本身
-
-
1.3 非正常情况运算2
-
有字符串参与的+运算:+号变为连字符将前后连接成整体字符串(数组无值或者只有一个值的时候进行运算会视为一个字符串)
-
隐式转换
-
除了有字符串参与的+运算,其它情况下,会将其它数据类型自动转换为数字类型,再参与运算,这个过程中就不用自己添加parseInt(),Number()等方法
-
纯字符串会转换为对应数字 “111” -> 111
-
1:true
-
0:false, null, "", " " -> 0
-
NaN:undefined、非空非纯数字字符串
-
二、比较运算符
-
也叫关系运算符,比较运算符比较它的操作数并返回一个布尔类型值
-
2.1 非正常情况1
-
特殊值参与比较运算(NaN与Infinity)
-
NaN参与:不等于和不全等于结果是true,其它得到的都是false,它跟自身也不相等或者全等
-
Infinity参与的运算视情况而定
-
有等于或者全等的都对(包含大于等于之类)
-
比任何数都要大-Infinity相反
-
2.2 非正常情况2
-
其它数据类型参与比较运算(排除字符串与字符串的比较)(null与undefined)
-
其它数据类型会隐式转换为数字进行比较
-
“123” -> 123 true -> 1 false -> 0 null -> 0(并非真是0)undefined -> NaN "" -> 0 "abc" -> NaN
-
-
null会不一样,比如
-
null == 0 // false
-
null >= 0 // false
-
null <= 0 // false
-
1 > null // true
-
null == null // true
-
null == undefined // true
-
这里可以把null想象为无限趋近于0的数但是不等于0
-
-
undefined的话除了与null相等其它时间当成NaN来看待
-
undefined
-
2.3 非正常情况3
-
字符串与字符串比较
-
不会发生隐式转换为数字,而是两个字符串的Unicode编码顺序
-
从前往后0-9, A-Z, a-z, 前面的小于后面的
-
比如
-
'' == ' ' // false
-
'' == '0' // false
-
'6' < '12' // false
-
'1' < 'a' // true
-
'a1' < 'a2' // true
-
-
不关心两个字符串的长度,从第一个字符开始比较,一次往后顺延比较,直到比较出大小
2.4 比较运算符运算顺序
-
从前往后比较,前面的结果与后面的进行比较
-
3 > 2 > 1 // false
-
过程
-
true > 1 // false
-
1 > 1 // false
-
-
所以不能按照平时的数学习惯看待,还是要依照js的语法习惯进行判断
三、逻辑运算符
-
逻辑运算符常用于布尔类型值之间;当操作数都是布尔值时,返回值也是布尔值
操作符 | 描述 |
---|---|
&& | 逻辑与运算符 且 都真才真 |
|| | 逻辑或运算符 有一真为真 |
! | 逻辑非运算符 结果只能是true或者false |
(1)非正常情况
-
运算过程需要将操作数隐式转换为布尔类型的值,参与判断计算
-
并不是所有的逻辑运算返回结果都是布尔值,其它数据参与得到的就是数据本身
(2)隐式转换为布尔值的规律
-
转换为false:NaN、0、”“、空字符串、null、undefined
-
转换为true:非0非NaN数字、非空字符串
-
a && b
-
如果a为true,返回值为b
-
如果a为false,返回值为a
-
-
a || b
-
如果a为true,返回值为a
-
如果a为false,返回值为b
-
(3)逻辑运算符运算顺序
-
同样的运算符从前往后按顺序
-
综合顺序:非(!)、与(&&)、或(||)
四、赋值运算符
-
赋值运算符必须有变量参与运算
-
变量位于操作符的左侧
赋值运算符符号
符号 | 描述 |
---|---|
= | 等于 |
+= | 加等于 |
-= | 减等于 |
*= | 乘等于 |
/= | 除等于 |
%= | 取余等于 |
++ | 递加 |
-- | 递减 |
五、一元运算符
-
有 ++ -- !
(1)++ --
-
自身加1,自身减1
-
++a与a++不一样,前者表达式还是a的值,而后者是a+1
(2)!
-
非运算符,返回一个布尔值
-
可用 !! 来进行布尔转换
(3)一些用法与注意事项
-
++可以用在循环遍历的i++
-
var a = 10, b = 20, c = 30
var num = a++ + ++b + c++ + ++a
// 得73
var b = 0, a = 0
b = a++ + a++ + a++
// 得3
// 因为第一个a++中的a还是0, 但是这个表达式完了之后后面得a++中的是1, 进而最后面试2, 运算完之后b = 0 + 1 + 2, a = 3
六、运算优先级
-
运算优先级也可以叫综合运算顺序
-
从高到低
-
① ()优先级最高
-
② 一元运算符 ++ -- !
-
③ 算数运算符 先* / % 后 + -
-
④ 关系运算符 > >= < <=
-
⑤ 相等运算符 == != === !==
-
也算作关系运算符
-
-
⑥ 逻辑运算符 先&& 后||
-
⑦ 赋值运算符
-
-
案例
// () -> 一元 -> 算数 -> 比较 -> 逻辑 -> 赋值
var a = 4
var num = 1 * (2 + 3) && ++a || 5 > 6 && 7 < 8 || !9
// num = 1 * 5 && ++a || 5 > 6 && 7 < 8 || !9
// num = 1 * 5 && 5 || 5 > 6 && 7 < 8 || false
// num = 5 && 5 || 5 > 6 && 7 < 8 || false
// num = 5 && 5 || false && true || false
// num = 5 || false || false
// num = 5