一元操作符
只能操作一个值的操作符叫一元操作符。一元操作符是ECMAScript最简单的操作符。
1.递增和递减操作符(前置和后置)
(1)前置递增操作符:
var age = 29;
++age;//30
这个前置递增操作与一下相同:var age = 29;
age = age + 1;//30
(2)前置递减操作符:var age = 30;
--age;//29
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//1+20为21
var num4 = num1 + num2;//现在num1已经是1,所以,1+20为21
(3)后置递增操作符:
后置与前置的最重要的一个区别就是:后置递增递减操作符是在包含它们的语句被求值之后才执行的。
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//因为要等包含它们的语句被求值之后再执行,所以依旧是2+20=22
var num4 = num1 + num2;//在这里被执行之前num1已经--了,所以是1+20=21
(4)应对不同的值时,递增递减操作符遵循的规律:var a = "2";
var b = "z";
var c = false;
var d = 1.1;
var e = {
valueOf:function(){
return -1;
}
};
a++;//值变成数值3
b++;//值变成NaN
c++;//值变成数值1
d--;//值变成0.10000000000000009
e--;//值变成-2
2.一元加和减操作符var a = "2";
var b = "z";
var c = false;
var d = 1.1;
var f = "01";
var e = {
valueOf:function(){
return -1;
}
};
a = +a;//值变成数值2
b = +b;//值变成NaN
c = +c;//值变成数值0
d = +d;//值未变,仍然是1.1
e = +e;//值变成数值-1
f = +f;//值变成数值1
var a = "2";
var b = "z";
var c = false;
var d = 1.1;
var f = "01";
var e = {
valueOf:function(){
return -1;
}
};
a = -a;//值变成数值-2
b = -b;//值变成NaN
c = -c;//值变成数值0
d = -d;//值未变,仍然是-1.1
e = -e;//值变成数值1
f = -f;//值变成数值-1
位操作符
var num1 = 25;
var num2 = ~num1;
alert(num2);//-26
var num1 = 25;
var num2 = -num1 - 1;
alert(num2);//-26 这验证了按位非操作的本质:操作数的负值减1
2.按位与(AND)
var a = 2;//二进制10
var b = a << 5; //二进制1000000,十进制的64
注意在向左移位后,原数值的右侧多了5个空位,用0来补充,左移不会影响操作数的符号位的var a = 64;//二进制1000000
var b = a >> 5;//二进制的10,十进制的2
注意在向右移位后,原数值的左侧,也就是符号位的右侧有空位,用符号位的值来填充7.无符号右移
var a = 64;//二进制1000000
var b = a >>> 5;//二进制的10,十进制的2
但是对于负数来说,情况不一样。首先无符号右移是以0来填充空位,而不像有符号右移以符号位的值来填充空位,其次,布尔操作符
1.逻辑非
逻辑非操作符由一个感叹号(!)表示,无论这个值是什么数据类型都适用,返回一个布尔值,首先将操作数转化为布尔值 之后取反。
alert(!false);//true
alert(!"blue");//false
alert(!"");//true
alert(!null);//true
alert(!undefined);//true
alert(!NaN);//true
alert(!0);//true
alert(!1234);//false
2.逻辑与 逻辑与操作符由(&&)表示,有两个操作数,只要其中一个操作数为false,则根本不会看第二个操作数,直接就是false了。
规则:如果第一个操作数是对象,则返回第二个操作数。
如果第二个操作数是对象,则第一个操作数结果为true的时候才会返回第二个操作数
如果两个操作数都是对象,则返回第二个操作数
如果有一个操作数是null,则返回null
如果有一个操作数是NaN,则返回NaN
如果有一个操作数是undefined,则返回undefined
3.逻辑或
逻辑或操作符由(||)表示,有两个操作数,只要其中一个操作数为true,则根本不会看第二个操作数,直接就是true了。
规则:如果第一个操作数是对象,则返回第一个操作数。
如果第二个操作数是对象,则第一个操作数结果为false的时候才会返回第二个操作数
如果两个操作数都是对象,则返回第一个操作数
如果两个操作数都是null,则返回null
如果两个操作数都是NaN,则返回NaN
如果两个操作数都是undefined,则返回undefined
应用实例:var a = b || c;
变量a将被赋予b或c中的一个值,如果b的值不是null,则它将被赋予给a,如果b是null,则将c的值赋予给a乘性操作符
1.乘法(*)
规则:如果操作数都是数值,执行常规的乘法计算
如果一个操作数是NaN,则结果是NaN
如果是Infinity与0相乘,则结果是NaN
如果是Infinity与非0数值相乘,则结果是Infinity或者-Infinity,取决于有符号操作数的符号
如果是Infinity与Infinity相乘,则结果是Infinity
如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后在应用上面规则
2.除法(/)
规则:如果操作数都是数值,执行常规的除法计算如果Infinity/Infinity,则结果是NaN
如果0/0,则结果是NaN
如果是Infinity/0,则结果是Infinity
如果是0/Infinity,则结果是0
如果是非零的有限数被零除,则结果是Infinity或者-Infinity,取决于有符号操作数的符号
如果是Infinity被任何非零数值除,则结果是Infinity或者-Infinity,取决于有符号操作数的符号
如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后在应用上面规则
3. 求模(%)
规则:如果操作数都是数值,执行常规的除法计算,返回除得的余数
如果一个操作数是NaN,则结果是NaN
如果一个无穷大的数除以一个有限大的数,则结果是NaN 例如:(Infinity%2)
如果一个有限大的数除以0,则结果是NaN 例如:(2%0)
如果是0%0,则结果是NaN
如果是Infinity/Infinity,则结果是NaN
如果是Infinity%0,则结果是NaN
如果是0%Infinity,则结果是0
如果有限大的数除以无限大的数Infinity,则结果是被除数,那个有限大的数
如果被除数是0,则结果是0
如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后在应用上面规则
加性操作符
1.加法
如果两个操作符都是数值,执行常规的加法运算
规则:如果一个操作符是NaN,则结果是NaN
如果Infinity加Infinity,则结果是Infinity
如果-Infinity加-Infinity,则结果是-Infinity
如果Infinity加-Infinity,则结果是NaN
如果是+0加+0,则结果是+0
如果是-0加-0,则结果是-0
如果是+0加-0,则结果是+0
不过,如果有一个操作符是字符串,还要加上一下规则
如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来
如果只有一个操作数是字符串,则将另一个操作数转化为字符串,然后再将两个字符串拼接起来
var a = 5 + 5;
alert(a);//10
var b = 5 + "5";
alert(b);//55 第一个操作符也被转化成字符串,变成了字符串拼接
var num1 = 5;
var num2 = 10;
var num3 = "The sum is "+num1 +num2;
alert(num3);// The sum is 510
var num1 = 5;
var num2 = 10;
var num3 = "The sum is"+(num1 +num2);
alert(num3);//The sum is 15
2.减法
如果两个操作符都是数值,执行常规的减法运算
规则: 如果一个操作符是NaN,则结果是NaN
如果是Infinity减Infinity,则结果是NaN
如果是-Infinity减-Infinity,则结果是NaN
如果是Infinity减-Infinity,则结果是Infinity
如果是-Infinity减Infinity,则结果是-Infinity
如果是+0减+0,则结果是+0
如果是+0减-0,则结果是+0
如果是-0减-0,则结果是+0
如果是-0减+0,则结果是-0var a = 5 - true;//4 true被转化成1
var b = NaN - 1;//NaN
var c = 5 -3;//2
var d = 5 - "";//5 ""被转化成0
var e = 5 - "2";//3 "2"被转化成2
var f = 5 - null;//5 null被转化成0
var g = 5 - Infinity;//-Infinity
var h = Infinity - 5;//Infinity
关系操作符
小于(<) 大于(>) 小于等于(<=) 大于等于(>=)
规则: 如果两个操作数都是数值,则执行数值比较
如果两个操作符都是字符串,则比较两个字符串对应的字符编码值
如果一个操作数是数值,则将另一个操作数也转化为数值,然后执行数值比较
如果一个操作数是对象,先调用valueOf(),没有调用toString()
如果一个操作数是布尔值,则现将其转化为数值,然后再执行比较。
比较两个字符串:比较的是字符串的字符编码,大写字母的字符编码全部小于小写字母
alert("Brick" < "alphabat");//true
alert("brick" < "alphabat");//false 在都为小写的时候,在字母表位置靠后的大
比较两个数字字符串:
alert("23" < "3");//true 两个操作数都是字符串,比较字符编码("2"的字符编码是50,"3"的字符编码是51)
alert("23" < 3);//false 一个操作数是数值,则将另一个也转换成数值再比较 23与3比较
alert("a" < 3);//false 字母"a"不能转化成合理的数值,因此就被转化成NaN,任何操作数与NaN进行比较,结构都是false
alert(5 < Infinity);//true
alert(5 < -Infinity);//false
相等操作符
相等不相等——先转换再比较,去等不全等——仅比较不转换1.相等(==)和不相等(!=)
规则:true转化为1,false转化为0
null和undefined是相等的
在比较相等性之前,不能将null和undefined转化成任何值
如果一个操作数是NaN,则相等操作符返回false,不相等操作符返回true,及时两个操作符都是NaN,相等操作符也返回false, NaN不等于NaN
如果两个操作数都是对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,则返回true
null == undefined;//true
NaN == NaN;//false
false == 0;//true
undefined == 0;//false
null == 0;//false
"5" == 5;//true
2.全等(===)和不全等(!==)
仅比较,不转化
alert("55" == 55);//true 因为转化之后相等
alert("55" === 55);//false 因为仅比较,数据类型不相等
alert(null == undefined);//true
alert(null === undefined);//false 类型不相同
条件操作符(三目运算符)
var max = (num1 > num2) ? num1 : num2;//max将会保存num1和num2中的最大值,如果num1>num2成立,则返回:前面的num1值,否则返回:后面的num2值
赋值操作符
乘/赋值(*=)
除/赋值(/=)
模/赋值(%=)
加/赋值(+=)
减/赋值(-=)
左移/赋值(<<=)
有符号右移/赋值(>>=)
无符号右移/赋值(>>>=)
设计这些操作符的主要目的是简化赋值操作符,使用它们不会带来任何性能的提升
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作:
var num1 = 1, num2 = 2, num3 = 3;//用于声明多个变量
使用逗号操作符还可以用来赋值,在用来赋值时,逗号操作符总会返回表达式中的最后一项:
var num = (5, 1, 4, 6, 0);//num的值为0,因为0是表达式的最后一项