运算符也叫操作符,是对一个或者多个值进行运算,比如typeof运算符,可以获得一个值的类型,会将值得类型以字符串的性质返回。
算数运算符
规则:
任何值和NaN运算都得到NaN
对非Number运算,都会先自动转换为Number,再运算
+加法运算符
对俩个值进行加法运算,返回结果,不影响原值
如果加号俩变都是字符串,则进行拼串操作,不会在进行自动转换
任何值和字符串做加法,都会先转换为字符串,然后再做拼串操作,可以利用这一特点为任意的数据类型做类型转化,只需要给这个数据类型+"",加空字符串就会由浏览器自动完成转换。
-减法操作符、*乘法运算符和/除法运算符
对俩个值做减法运算、乘法运算和/除法运算时,都会自动转换为Number类型,我们可以利用这个特点做隐士类型转换。
一元运算符
即只需要一个操作数
+正号和-负号
+ 正号 对数字不会产生任何影响
- 负号 对数字进行取反
对于非Number类型,会先强制转换为Number,再取反,可以利用这一特点,对其他数据类型做隐性转换。
例子:
result = 1 + "2" + 3 ---> "123"
result = 1 + +"2" + 3 --->6
自增(++)和自减(--)
使变量在自身的基础上增加一或者减少一,对一个变量进行自增或者自减,影响的是原变量。
a++ :a的值会自动加1,但是 a++作为表达式是返回原来的a的值,是不变的。
自增的分类
后++(a++)
a的原值都会立即+1,但是a++作为表达式是返回原来的a的值,是不变的。
前++(++a)
a的原值都会立即+1,但是++a作为表达式是返回原变量的新值,即增加过1的值。
自减同上
逻辑运算符
!非运算符
可以对一个值进行非运算,即对一个布尔值进行取反操作,true变为false,或者false变为true。
如果对一个值进行俩次取反,不会变化!!
如果对非布尔值进行非运算,会先把其转换为布尔值,然后再取反,可以利用这特点,将其他类型转换为布尔类型,即进行俩次取反。
&&与运算符
对符号俩侧进行与运算,并且返回结果
规则:俩个值中值要有一个值是false即为false,只有俩个值均为true的时候,才返回true。
在js中,&&操作属于短路与,即只要第一个值是false,就直接返回false,不会再检查第二个值。
true&&alert("hello"); 第一个值为true,会检查第二个值,会弹出!
false&&alert("hello"); 第一个值为false,不会检查第二个值,不会弹出!
||或操作符
与&&操作正好相反,俩个值中只要有一个为true,就返回true,同时也是短路操作,第一个值为true,就不会检查第二个值了。
非布尔值的与和非运算,会将其转换为布尔值再运算,并且返回原值
非布尔值的与和非运算:
与运算:如果第一个值是true,则直接返回第二个值,如果第一个值是false,则返回第一个值;
或运算:如果第一个值是true,则直接返回第一个值,如果第一个值是false,则返回第二个值;
赋值运算符
= 将符号右侧的值赋值给符号左侧的变量
+=,-=,*=,/=, %=
关系运算符
比较俩个值的大小,如果关系成立返回true,不成立返回false
>, >=, <, <=
规则:
对于非数值进行比较,会将非数字转换为数字,在进行比较
任何值与NaN做比较,都是false
如果符号俩侧都是字符串时,不会将其转换为数字,而是比较俩个字符串的的字符编码,如果字符串不是一位的,则一位一位的进行比较,前面位数比较出大小则不看后面的
"abc" < "b" -- >true
"bbc" < "b" -- >false
可利用这一特性,对英文进行排序。
注意比较俩个字符串类型的数字时,一定要把字符串转换成数字进行比较,不然会出现不可控的问题。尤其是从前端输入框获取值进行比较时,切记切记。
相等运算符和不相等运算符
== 比较俩个值是否相等,相等则返回true,否则返回false。
如果比较的值不同时,会进行类型转换再比较,但是转换成什么类型是不定的。
a == 4 --->false
true == "1" --->true
"1" == 1 --->true
null == 0 --->false
underfined == null --->true
NaN == NaN--->false
undefined 衍生于null ,所以比较的时候他们相等,但是不全等,NaN不和任何值相等,所以不能通过一个值是否等于NaN来判断,是否是NaN,但是可以用isNaN函数来进行判断。
!= 不相等运算符,规则类似相等运算符。
全等===,和相等类似,但是不会做类型转换,所以不仅要值相等,类型也需要一致。
不全等 !==,和不相等类似,但是不会做类型转换。
条件运算符
也叫三元运算符
语法:条件表达式?语句1:语句2;
执行流程:首先对表达值进行求值,如果返回true,则执行语句1,并返回结果,如果为false,则执行语句2,并返回结果。
获取a、b中的最大值:
var max = a>b?a:b;
运算符优先级和结合性
结合性:向左结合也就是从左向右结合,向右结合也就是从右向左结合。
优先级的大概顺序为:
1:最高:[],()
2:单目运算符:++ -- - ~ ! delete new typeof void
3:算数运算符:*、/、% ,+、-
4:双目位操作运算符:<<、>>、>>>
5:比较运算符:<、<=、>、>=、instanceof ==、!=、===、!==
6:单目位操作运算符:& 、^ 、|
7:逻辑运算符:&&、||
8:三目运算符(条件运算符)?:
9:赋值类运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<、<=、>、>=、>>=
10:多个运算符:,