操作符:
操作对象时, 相应的操作符都会调用对象的valueOf() 和toString() 方法;
1、 一元操作符: 只能操作一个值的操作符。
递增和递减操作符:
var age = 29;
++age 相当于:age = age + 1;
--age 相当于:age = age - 1;
PS:执行前置递增或递减操作时,变量的值都是在语句被求值之前改变的。
var age = 29;
var anotherAge = --age + 2;
alert(age) //28
alert(anotherAge) //30
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//21
var num4 = num1 + num2;//21 (注意点,由于num1的值已被改变为1)
PS:执行后置递增或递减操作时,变量的值都是在包含他们的语句被求值之后改变的。
var num = 2;
var num2 = 20;
var num3 = num1-- + num2; //22(num1使用递减前的值先执行计算)
var num4 = num1 + num2;//21(num1使用递减后的值先执行计算)
计算规则:适用于整数、字符串、布尔值、浮点数、和对象。
1、在应用于一个包含有效数字字符的字符串时,先将其转换成数字,在执行加减1的操作,字符串变量变成数值变量。
2、在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量。
3、在应用于布尔值false时,先将其转换成0,在执行加减1的操作。布尔值变量变成数值变量。
4、在应用于布尔值true时,先将其转换成1,在执行加减1的操作。布尔值变量变成数值变量。
5、在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。
如果结果是NaN,则再调用toString()方法,再应用前述规则。对象变量变成数值变量。
例如:
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function(){
return - 1;
}
};
s1++; //变成数字3
s2++; //变成数字NaN
b--; //变成数字-1
f--; //变成数字0.10000000000000009(由于浮点数舍入错误导致)
o--; //变成数字-2
2、一元加和减操作符:正负操作;
3、位操作符:有符号整数和无符号整数(js中基本都是有符号整数,对于无符号整数,第32位不在表示符号)
例如:18的二进制表示为:00000000000000000000000000010010(32位)
-18的为禁止便是为:11111111111111111111111111101110
计算过程为:1、先转码18的二进制码 00000000000000000000000000010010
2、求得二进制反码 11111111111111111111111111101101
3、反码加 11111111111111111111111111101101
+ 1
得到-18的二进制表示; 11111111111111111111111111101110
PS:对于NaN和Infinity值执行位操作时,都会被当成0处理。
对于非数值执行位操作,使用Number()处理为数值,在进行位操作。得到结果为数值。
4、按位操作符:用~表示。返回数值的反码。
例如:
var num1 = 25; //二进制00000000000000000000000000011001
var num2 = ~num1; //二进制11111111111111111111111111100110
alert(num2); //-26
相当于 :var num2 = -num1 - 1;//-26
5、按位与操作符:用&表示。
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 0
0 1 0
0 0 0
简而言之就是只有两个数值的位都是1时,才返回1,任何一位是0都将返回0;
例如:
var result = 25 & 3;
25 = 0000 0000 0000 0000 0000 0000 0001 1001;
3 = 0000 0000 0000 0000 0000 0000 0000 0011;
AND= 0000 0000 0000 0000 0000 0000 0000 0001;
6、按位或:用|表示。
与按位与相反即可:
标题7、按位异或:用^表示。
第一个数值的位 第二个数值的位 结果
1 1 0
1 0 1
0 1 1
0 0 0
简而言之就是只有一个1时返回1,都是1时返回0。都是0时返回0;
8、左移操作:用<<表示
例如:
var oldValue = 2; //等于二进制10
var newValue = oldValue << 5; //等于二进制1000000,十进制的64
注意左移之后,右侧多出空位,需用0补齐32位。以便于得到完整的32位二进制值。
左移不会影响到操作数的符号位:(注意!!!!!!!)
有符号右移操作:用>>表示。
例如:
var oldValue = 64; //等于二进制1000000
var newValue = oldValue >> 5; //等于二进制10,十进制的2
注意右移之后,左侧多出空位,需在符号位之右用0补齐32位。以便于得到完整的32位二进制值。
无符号右移:用>>>表示。
对于正数来说结果和有符号右移姐夫哦一致!
对于负数来说就不一样了:得到结果是非常之大。(略)
布尔操作符:
1、逻辑非(!):规则如下:
、操作数是一个对象,返回false。
、操作数是一个空字符串,返回true。
、操作数是一个非空字符串,返回false。
、操作数是数值0,返回true。
、操作数是任意非0数值(包括Infinity),返回false。
、操作数是null,返回true。
、操作数是NaN,返回true。
、操作数是undefined,返回true。
2、逻辑与(&&)(短路操作)
第一个数值的位 第二个数值的位 结果
true true true
true false false
false true false
false false false
规则如下:
如果操作数全是布尔值,则如上规则:
如果有一个操作数不是布尔值:
、第一个是对象,返回第二个操作数。
、第二个是对象,则只有第一个操作数求值结果为true时,返回该对象。
、两个操作数都是对象,则返回第二个对象。
、如果一个操作数为null,则返回null。
、如果一个操作数为NaN,则返回NaN。
、如果一个操作数为undefined,则返回undefined。
3、逻辑或(||)
两个操作数同为布尔值时,与逻辑与操作规则相反:
如果有一个操作数不是布尔值:规则如下:
、第一个是对象,返回第一个操作数。
、第一个是操作数的求值为false,返回第二个操作数。
、两个操作数都是对象,则返回第一个对象。
、如果两个操作数为null,则返回null。
、如果两个操作数为NaN,则返回NaN。
、如果两个操作数为undefined,则返回undefined。
4、算数运算符
乘法:*
规则如下:
、两个正数或者负数相乘得正数,有一个负数,得负数。超出范围返回Infinity或-Infinity。
、如果有一个操作数为NaN,结果为NaN。
、Infinity与0数值相乘,结果为NaN。
、Infinity与非0数值相乘,结果为Infinity或-Infinity。
、Infinity与Infinity相乘,结果为Infinity。
、如果一个操作数不是数值,则调用Number()转换成数值,运用以上规则。
除法:(/)
规则如下:
、同乘法第一条。
、同乘法第二条。
、如果Infinity被Infinity除,结果是NaN。
、如果是0被0除,结果为NaN。
、如果是非0的有限数被0除,结果是Infinity或-Infinity。取决于有符号操作数的符号。
、如果是Infinity被任何非0数值除,结果是Infinity或-Infinity。取决于有符号操作数的符号。
、如果有一个操作数不是数值,则调用Number()方法转换,在应用以上规则。
求模(%)
规则如下:
、两个操作数均为数值,按照除法计算,返回余数。
、如果被除数是无穷大时而除数是有穷大的数值,返回NaN。
、如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数。
、如果被除数是有穷大而除数是0时,返回NaN。
、如果Infinity被Infinity除,返回NaN.
、如果被除数为0,返回0。
、如果有一个操作数不是数值,则调用Number()方法转换,在应用以上规则。
加法:(+)
规则如下:
、如果一个操作数是NaN,返回NaN.
、如果一个操作数是Infinity或-Infinity,返回Infinity或-Infinity.
、如果Infinity+(-Infinity),返回NaN.
、+0 加 +0,返回+0;
、-0 加 -0,返回-0;
、+0 加 -0,返回+0;
如果有一个操作数是字符串,遵循如下规则:
、两个操作数都是字符串,则是字符串拼接。
、一个操作数是字符串,将非字符串的操作数转化为字符串进行拼接。
、如果一个操作数是对象、数值、布尔值、则调用他们的toString()方法取得相应的字符串值,然后应用上述两条规则。
、对于undefined和null,则分别调用String()方法取得字符串进行拼接。
减法(-)
规则如下:
、两个操作数都是数值,执行算数运算。
、一个操作数为NaN,返回NaN。
、Infinity 减 Infinity,返回NaN。
、-Infinity 减 -Infinity ,返回NaN。
、Infinity 减 -Infinity ,返回Infinity。
、-Infinity 减 Infinity,返回-Infinity。
、+0 减 +0 返回+0;
、+0 减 -0 返回-0;
、-0 减 -0 返回+0;
、如果一个操作数是字符串、布尔值、null或undefined,则先调用Number()方法转为数值,再根据以上规则执行。
如果转换结果是NaN,则返回NaN。
、如果有一个操作数是对象,则调用对象的valueOf()方法取得对象的数值,如果转换结果是NaN,则返回NaN。
如果对象没有valueOf()方法,则调用其toString()方法,并将得到的字符串转换为数值进行如上规则。
相等操作符(==)和不等操作符(!=)
null == undefined 返回 true
"NaN"== NaN 返回 false
NaN == NaN 返回 false
5 == NaN 返回 false
NaN != NaN 返回 true
false == 0 返回 true
true == 1 返回 true
true == 2 返回 false
undefined == 0 返回 false
null == 0 返回 false
"5" == 5 返回 true
全等和不全等
=== !==
条件运算符:? :
赋值操作符:=
*=
/=
+=
-=
%=
左移/赋值 <<=
有符号右移/赋值 >>=
无符号右移/赋值 >>>=
逗号操作符:,