1、运算符两侧的操作数的数据类型一定是一样的,如果不一样,会发生隐式类型转化
2、NaN与任何数据计算都是NaN,在关系运算符中任何数据和NaN进行比较,结果都是false
1、运算符从功能上分类:
-
1、算数运算符:+ - * / %
- 优先级:* / % 高于+ -,如果优先级一样,则从左到右计算(左结合性)
-
加号运算符:
- 任何非数值(非字符串)的数据在参与加法运算之前,都会自动隐式转化成数值类型,再参与计算(true→1、null→0)
- 任何数据和字符串相加,+就变成了字符串拼接运算符,不再是加号
-
减号运算符:
- 任何非数值(非字符串)的数据在参与减法运算之前,都会自动隐式转化成数值类型,再参与计算
- 任何数据和字符串相减,都会尝试把字符串转化成数字,再进行运算
-
乘号运算符
- 同减号运算符
-
除号运算符
- 1 / null //Infinity(无穷大,null转化成0)
-
除余运算符
- 3 % 0 //NaN
- 10 % -3 //1
- -10 % 3 //-1
- 在除余时,会对参加运算的数先取绝对值,最后的结果与被除数的正负值相同。
-
加号运算符:
- 优先级:* / % 高于+ -,如果优先级一样,则从左到右计算(左结合性)
-
2、赋值运算符:=、+=、-=、*= 、/=、%=(从后向前计算)
- 优先级低于算术运算符
- = 有副作用,整体也有一个值,是左值,c = 110,c是110,110是110,c=110也是110
-
3、自增自减运算符:++、- -(一元运算符)
- ++在前和++在后在整体上的值是有区别的,但操作数的值肯定加1
- a++整体的值是一个旧值,没有加1的值,操作数(a)的值加1
- ++a整体的值是一个新值,加1后的值,操作数(a)的值加1
-
4、关系运算符(>、<、>=、<=、==、===、!=、!==)
- 对非数值类型的数据,会先转换成数值类型
- 任何数据和NaN比较,结果都是false
- 运算符两侧操作数的数据类型要一致,如果不一致,会发生类型转化
- undefined会尝试转化成number,und转成number结果是NaN
- 字符串的比较会转成ASCLL码
-
5、逻辑运算符(逻辑与&&、逻辑或||、逻辑非!)
- 逻辑与:只有两个操作数,都为true,结果才为true
- 逻辑或:只要有一个操作数为true,结果就为true
- 逻辑非:一元运算符,如果true,逻辑非后,就为false,如果是false,逻辑非后,就为true。
- 0会隐式转化成false,但是整体的值不是转化后的值,整体的值是转化之前的值,会输出0而不是false
- 使用逻辑运算符进行逻辑运算时,操作数如果不是布尔值,会发生隐式类型转化,转化成布尔值(undefined转化成false)
- 如果第1个操作数可以决定整体的值,那么就不会再运算第二个操作数
- 如果第1个操作数就决定了整体的值,那么最终的结果就是第1个操作数的值
- 如果第1个操作数不能决定整体的值,那么整体的值就是第2个操作数的值
2、运算符从操作数的个数分类:
一元:逻辑非、+“123”
二元:+、- 、* 、
三元:?:(表达式?结果A:结果B)