JavaScript操作符(operator)

操作符包括

  • 算术操作符
  • 位操作符
  • 关系操作符
  • 相等操作符

一元操作符

一元操作符只有一个操作数

1.递增(++)和递减(–)操作符
可用于字符串、布尔值、浮点数、整数和对象,操作数自加1或自减1
分为:前置型后置型

  • 前置型
    在语句中,前置型先进行自加或自减,再执行操作
var age=29;
++age;     //30
--age;     //29
  • 后置型
    在语句中,先进行操作,再进行自加或自减
var age=29;
age++;     //30
age--;     //29

单独看不能发现两者的区别,看以下例子,能够明显的看出前置与后置的区别:

var age1=29;
var anotherAge1= --age + 2;     //30

var age2=29;
var anotherAge2= age-- + 2;    //31

递增和递减操作遵循规则
应用于包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作
应用于不包含有效数字字符的字符串时,将变量的值设置为NaN
应用于boolean值时,先将其转换为数值,在执行操作
应用于浮点数时,直接执行操作
应用于对象时,先调用valueOf(),如果结果正确,直接执行操作;如果结果为NaN,调用toString()在执行操作

2.一元加减操作

  1. 当将一元加操作符放在数值前,对数值不会产生任何影响;在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值进行转换
  2. 一元减操作符主要用于表示负数,一元减操作符的转换规则和一元加操作符一样
var s1 = +"01";       //1
var s2 = +1.1;        //1.1
var s3 = +"1.1";      //1.1
var s4 = +"z;         //NaN
var s5 = +false;      //0
var s6 = {
    
    
	valueOf:function(){
    
    
		return -1;
	}
};    
s6=+s6;           //-1
var s1 = -"01";       //-1
var s2 = -1.1;        //-1.1
var s3 = -"1.1";      //-1.1
var s4 = -"z;         //NaN
var s5 = -false;      //0
var s6 = {
    
    
	valueOf:function(){
    
    
		return -1;
	}
};    
s6=-s6;           //1

位操作符

按内存中表示数值的位来操作数值,先将64位的值转换为32位,执行位操作,再转换回64位数值
NaN、Infinity当0来处理,非数值调用Number()

按位非(~)
返回数值的反码。本质: 操作数的负值减1。
按位非是数值表示的最底层执行操作,所以速度比取负减1更快

var num=25;
num=~num;     //-26

按位与(&)
有两个操作数。本质: 将两个数值的每一位对齐,对相同位置上的两个数执行AND操作:
1 & 1=>1
1 & 0=>0
0 & 1=>0
0 & 0=>0

var result=25 & 3;   //1

以上例子是将25和3转换位二进制,逐位进行AND操作

按位或(|)
有两个操作数。
1 | 1=>1
1 | 0=>1
0 | 1=>1
0 | 0=>0

var result=25 | 3;   //27

按位异或(^)
有两个操作数。相异为1.
1 ^ 1=>0
1 ^ 0=>1
0 ^ 1=>1
0 ^ 0=>0

var result=25 ^ 3;   //26

左移(<<)
将数值的所有位向左移动指定的位数(移动的是二进制)
左移不会影响符号位

var num=2;
num=num<<5;    //64

以上例子是将2转为二进制10,将10向左移动5位,添0,即1000000,就是二进制的64

有符号右移(>>)
将数值向右移动,但保留符号位,有符号的右移和左移恰好相反。
用符号位的数值来填充

var num=64;
num=num>>5;    //2

var num=-2;
num=num>>5;    //-1

无符号右移(>>>)
这个操作符会将32位都向右移动,对正数来说,无符号右移得结果和有符号右移的结果相同。但对负数来说,无符号右移是用0来填充。
无符号右移会把负数的二进制码当作正数的二进制码

var num=-64;
num=num>>>5;     //134217726

有关位运算的简单计算由此去========》go

布尔操作符(逻辑运算符)

&&运算是与运算,只有所有都为true,&&运算结果才是true;
true && true => true
true && false => false
false && true => false
false && false => false

逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值,在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值:

1.如果第一个操作数是对象,则返回第二个操作数
2.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才返回该对象
3.如果两个操作数都是对象,则返回第二个操作数
4.如果第一个操作数是null,则返回null
5.如果第一个操作数是NaN,则返回NaN
6.如果第一个操作数是undefined,则返回undefined
逻辑与是短路操作,即如果第一个操作数能够决定结果,那么就不会对第二个操作数求值。逻辑与操作中,当第一个操作数是false时,则无论第二个操作数是什么值,结果都是false

var found=true;
var result=found&&someElement;    //报错

var found=false;
var result=found && someElement;   //不会发生错误,result为false

||运算是或运算,只要其中有一个true,||运算结果都为true;
true || true => true
true || false =>true
false || true => true
false || false => false
与逻辑与相似,如果有一个操作数不是布尔值,则结果不一定是布尔值:
1.如果第一个操作数是对象,则返回第一个操作数
2.如果第一个操作数的求值结果为false,则返回第二个操作数
3.如果两个操作数都是对象,则返回第一个操作数
4.如果两个操作数都是null,则返回null
5.如果两个操作数都是NaN,则返回NaN
6.如果两个操作数都是undefined,则返回undefined
逻辑或也是短路操作

var found=true;
var result=found || someElement;    //不会发生错误,结果为true

var found=false;
var result=found || someElement;   //报错

!运算是非运算,他是一个单目运算符,把true变成false,把false变为true;
将他的操作数转为一个布尔值,然后求其反
1.如果操作数是对象,则返回false
2.如果操作数是一个空字符串,则返回true
3.如果操作数是一个非空字符串,则返回false
4.如果操作数是0,则返回true
5.如果操作数是任意非0数值(包括Infinity),则返回false
6.如果操作数是null,则返回true
7.如果操作数是NaN,则返回true
8.如果操作数是undefined,则返回true

!false;       //true
!"blue";     //false
!0;          //true
!NaN;        //true
!"";         //true
!12345;     //false

!!模拟Boolean()转型函数,获得一个值对应的布尔值

乘性操作符

乘(*)
用于计算两个操作数的乘积
处理特殊值的规则:
1.有一个操作数是NaN===>NaN
2.Infinity * 0==>NaN
3.Infinity * 非0数值===>Infinity/-Infinity(取决于符号)
4.Infinity * Infinity===>Infinity
5.乘积超过数值的表示范围 ,返回Infinity/-Infinity(取决于符号)
6.如果有一个操作数不是数值,在后台调用Number(),然后应用上面的规则

除(/)
处理特殊值的规则:
1.有一个操作数是NaN===>NaN
2.0 / 0,返回NaN
3.非0数值 * 0,返回Infinity/-Infinity(取决于符号)
4.Infinity / Infinity,返回NaN
5…Infinity /任意非0数值,返回Infinity/-Infinity(取决于符号)
6.乘积超过数值的表示范围 ,返回Infinity/-Infinity(取决于符号)
7.如果有一个操作数不是数值,在后台调用Number(),然后应用上面的规则

求模(%)
返回余数
处理特殊值的规则:
1.被除数无穷大而除数有限大(无穷大%有限大),返回NaN
2.有限大的值 % 0,返回NaN
3.被除数有限大除数无穷大,返回被除数
4.Infinity % Infinity,返回NaN
5.0%任意数,返回0
6.如果有一个操作数不是数值,在后台调用Number(),然后应用上面的规则

加减操作符

加法(+)
如果两个操作数都是数值,执行常规的加法计算,然后根据规则返回结果
1.如果有一个操作数是NaN,则返回NaN
2.Infinity + Infinity = Infinity
3.-Infinity + -Infinity = -Infinity
4.Infinity + -Infinity = NaN
5.+0 + +0 = +0
6.-0 + -0 = -0
7.+0 + -0 = +0
8.有一个操作数是字符串:①如果两个操作数都是字符串,则第二个操作数与第一个操作数拼接起来;②如果只有一个操作数是字符串,则将另一个操作数转换为字符串,饭后拼接起来
9.如果有一个操作数是对象、数值、或布尔值,则调用他们的toString()方法取得对应的字符串值,在应用前面的规则
10.对于null、undefined,调用String()获得字符串值

var num=5+5;    //10
var result=5+"5";   //55

var num1=5;
var num2=10;
var message="The sum of 5 and 10 is "+num1+num2;   
//"The sum of 5 and 10 is 510"

减法(-)
规则:
1.如果有一个操作数是NaN,则返回NaN
2.Infinity - Infinity = NaN
3.-Infinity - -Infinity = NaN
4.Infinity - -Infinity = Infinity
5.-Infinity - Infinity = -Infinity
6.+0 - +0 = +0
7.-0 - +0 = -0
8.-0 - -0 = +0
9.有一个操作数是字符串、布尔值、null或undefined:先在后台调用Number()函数将其转换为数值,然后根据前面的规则执行
10.如果有一个操作数是对象,则调用valueOf()取得该对象的数值,如果得到NaN,则减法结果为NaN;如果没有valueOf(),则调用toString()方法取得对应的字符串值,并将其转换为数值。

var num1=5-true;      //4
var num2=NaN-1;       //NaN
var num3=5-3;         //2
var num4=5-"";        //5
var num5=5-"2";       //3
var num6=5-null;      //5

关系操作符

小于(<)、大于(>)、小于等于(<=)、大于等于(>=)

相等运算符

实际上,JavaScript允许对任意数据类型作比较,但特别要注意相等于算符。JavaScript在设计时,有两种比较运算符:
第一种是==,它会自动转换类型再比较。!=:不相等
第二种是===,他不会自动转换类型,如果两个表达式(包括他们的数据类型)相等,则结果为true。!==:不全等
注意: NaN与其他的值都不想等,包括他自己,唯一能判断NaN的方法是通过isNaN()函数:

isNaN(NaN);//true

最后要注意的浮点数的比较:

1/3===(1-2/3);//false

浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算他们之差的绝对值,看是否小于某个阙值:

Math.abs(1/3-(1-2/3))<0.0000001;//true

相等和不相等的转换规则
1.如果有一个布尔值,将布尔值转换为数值
2.有一个字符串,另一个是数值,则将字符串转换为数值
3.一个是对象,另一个不是,则调用valueOf(),将得到的值按照 前面的规则执行
4.null和undefined是相等的
5.在比较相等前,不能将null和undefined转换为其他值
6.有一个是NaN,则结果是 false
7.两个操作数都是对象,则比较他们是不是同一个对象

null==undefined    //true
"NaN"==NaN        //false
5==NaN            //false
NaN==NaN          //false
NaN!=NaN          //true
false==0          //true
true==1           //true
true==2           //false
undefined==0      //false
null==0           //false
"5"==5            //true

全等:

null===undefined      //false

三元运算符(条件操作符)

variable=boolean_expression?true_value:false_value

var max=(num1>num2)?num1:num2

上面的例子是说,当num1大于num2时,max等于num1,否则等于num2

赋值操作符

简单的赋值操作符就是=,其作用就是把右边的值赋给左边的变量
复合赋值操作符:

  • 乘/赋值 *=
  • 除/赋值 /=
  • 膜/赋值 %=
  • 加赋值 +=
  • 减/赋值 -=

逗号操作符

使用逗号操作符可以在一条语句中执行多个操作

var num1=1,num2=9,num4=8;
var num=(5,6,7,2,0);//num=

运算符的优先级

  1. ()
  2. 一元运算符
  3. 算术运算符
  4. 关系运算符
  5. 相等运算符
  6. 逻辑运算符
  7. 赋值运算符

猜你喜欢

转载自blog.csdn.net/weixin_52841956/article/details/112745631