操作符用于数据值,操作符包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符等。JavaScript的操作符适用于很多值,例如字符串、数字值、布尔值,甚至对象。在应用于对象时,相应的操作符会调用对象的valueOf()
和(或)toString()
方法,来取得可以操作的值。
一、一元操作符
只能操作一个值的操作符叫一元操作符
++(--)值
先递增(递减),后执行语句;值++(--)
先使用值执行语句,后递增(递减)NaN
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
一元加和减操作符主要用于基本的算术运算,也可以用于转换数据类型
Number()
转型函数一样对这个值执行转换valueOf()
和(或)toString()
方法,在转换得到的值。var s1="01";
var s2="1.1";
var s3="z";
var b=false;
var f=1.1;
var 0={
valueOf:function(){
return -1;
}
};
s1=-s1;//-1
s2=-s2;//-1.1
s3=-s3;//NaN
b=-b;//0
f=-f;//-1.1
0=-0;//1
二、位操作符
NaN
和Infinity
值应用位操作时,这两个值都会被当成0来处理Number()
函数将该值转换为一个数值(自动完成),然后在应用位操作//求得-18的二进制码
//1.首先求得18的二进制码
0000 0000 0000 0000 0000 0000 0001 0010
//2.求其二进制反码,即0和1互换
1111 1111 1111 1111 1111 1111 1110 1101
//3.二进制反码加1
1111 1111 1111 1111 1111 1111 1110 1110
//注意:在处理有符号整数时,是不能访问位31的
//JavaScript会尽力地隐藏信息。在以二进制字符串形式输出一个负数时,能看到的是在这个负数绝对值的二进制码前面加上了一个符号
~
),执行按位非的结果就是返回数值的反码&
),它有两个操作数|
),它有两个操作数^
),它有两个操作数<<
),这个操作符会将数值的所有位向左移动指定的位数>>
),这个操作符会将数值向右移动,但保留符号位>>>
),这个操作符会将数值的32位都向右移动//1.按位非(~)
var num1=25;//二进制0000 0000 0000 0000 0000 0000 0001 1001
var num2=~num1;//二进制1111 1111 1111 1111 1111 1111 1110 0110
alert(num2);//-26
var num1=25;
var num2=-num1-1;
alert(num2);//"-26"
//2.按位与(&)
var result=25&3;
alert(result);//1
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
OR=0000 0000 0000 0000 0000 0000 0000 0001
//3.按位或(|)
var result=25|3;
alert(result);//27
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
OR=0000 0000 0000 0000 0000 0000 0001 1011
//4.按位异或(^)
var result=25^3;
alert(result);//26
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
XOR=0000 0000 0000 0000 0000 0000 0001 1010
//5.左移(<<)
var oldValue=2;//等于二进制的10
var newValue=oldValue<<5;//等于二进制的1000000,十进制的64
//6.有符号的右移(>>)
var oldValue=64;//等于二进制的1000000
var newValue=oldValue>>5;//等于二进制的10
//7.无符号右移(>>>)
//(1)正数
var oldValue=64;//等于二进制的1000000
var newValue=oldValue>>>5;//等于二进制的10
//(2)负数
var oldValue=-64;//二进制1111 1111 1111 1111 1111 1111 1100 0000
var newValue=oldValue>>>5;//等于十进制134217726
三、布尔操作符
在一门编程语言中,布尔操作符非重要,有了它,流控制语句、循环语句才有作用
!
)!
)可以应用于JavaScript中的任何值。无论这个值是什么类型,都将会返回一个布尔值false
true
flase
true
Infinity
),返回false
null
,返回true
NaN
,返回true
undefined
,返回true
Boolean()
转型函数的行为。其中,第一个逻辑非操作会基于无论什么操作数返回一个布尔值,而第二个逻辑非操作则会对该布尔值取反,于是得到了这个值真正对应的布尔值。最终结果与对这个值使用Boolean()
函数相同alert(!false);//true
alert(!"blue");//false
alert(!0);//true
alert(!NaN);//true
alert(!"");//true
alert(!12345);//false
alert(!!"blue");//true
alert(!!0);//false
alert(!!NaN);//false
alert(!!"");//false
alert(!!12345);//true
&&
)&&
),它有两个操作数true
的情况下才会返回该对象null
,则返回null
NaN
,则返回NaN
undefined
,则返回undefined
false
,则不会继续对第二个操作数求值var found=true;
var result=(found&&someUndefinedVar);//发生错误
alert(result);//这一行不会执行
var found=false;
var result=(found&&someUndefinedVar);
alert(result);//false
//第一个操作数的值是false,不会再对第二个操作数求值。所以即使someUndefinedVar没有定义,警告框也会显示出来
||
)||
),它有两个操作数false
,返回false
;否则返回true
false
,则返回第二个操作数null
,则返回null
NaN
,则返回NaN
undefined
,则返回undefined
true
,就不会对第二个操作数求值null
或undefined
值var found=true;
var result=(found||someUndefinedVar);//不会发生错误
alert(result);//true
//变量found值是true,不会对someUndefinedVar进行求值
var myObject=preObject||backObject;
//如果preObject的值不是空,则将preObject的值赋给myObject;如果是空,则将backObject的值赋给myObject
四、乘性操作符
在操作数为非数值时,会执行自动的类型转换.如果参与乘性计算的某个操作数不是数值,后台会先使用Number()
转型函数将其转化为数值。即空字符串被当做0,布尔值true
被当做为1
*
)*
),用于计算两个数值的乘积Infinity
或-Infinity
NaN
,则结果是NaN
Infinity
与0相乘,则结果是NaN
Infinity
与非0数值相乘,则结果是Infinity
或-Infinity
,取决于有符号操作数的符号Number()
将其转换为数值,然后再应用上面的规则var result=34*56;
/
)/
),执行第二个操作数除以第一个操作数的计算Infinity
或-Infinity
NaN
,则结果是NaN
Infinity
被Infinity
除,则结果是NaN
NaN
Infinity
或-Infinity
,取决于有符号操作数的符号Infinity
被任何非零数值除,则结果是Infinity
或-Infinity
,取决于有符号操作数的符号Number()
将其转换为数值,然后应用上面的规则var result=66/11;
%
)%
)NaN
NaN
Infinity
被Infinity
除,则结果是NaN
Number()
将其转换为数值,然后再应用上面的规则var result=26%5;//1
五、加性操作符
与乘性操作符类似,加性操作符也会在后台转换不同的数据类型。对于加性操作符来说,相应的转化规则还有些复杂
+
)NaN
,则结果是NaN
Infinity
加Infinity
,则结果是Infinity
-Infinity
加-Infinity
,则结果是-Infinity
Infinity
加-Infinity
,则结果是NaN
+0
加+0
,则结果是+0
-0
加-0
,则结果是-0
+0
加-0
,则结果是+0
toString()
方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefined
和null
,则分别调用String()
函数并取得字符串"undefined"
和"null"
var result1=5+5;//两个数值相加
alert(result1);//10
var result2=5+"5";//一个数值和一个字符串相加
alert(result2);//"55"
var num1=5;
var num2=10;
var message="The sum of 5 and 10 is "+num1+num2;
alert(message);//"The sum of 5 and 10 is 510"
var num1=5;
var num2=10;
var message="The sum of 5 and 10 is "+(num1+num2);
alert(message);//"The sum of 5 and 10 is 15"
//一对圆括号把两个数值变量括在一起,这样就会告诉解析器先计算其结果,然后再将结果与字符串拼接起来
-
)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()
方法并将得到的字符串转换为数值var result1=5-true;//4
var result2=NaN-1;//NaN
var result3=5-3;//2
var result4=5-"";//5
var result=5-"2";//3
var result=5-null;//5
六、关系操作符
<
)、大于(>
)、小于等于(<=
)和大于等于(>=
)这几个关系操作符用于对两个值进行比较。这几个操作符都返回一个布尔值valueOf()
方法,并用得到的结果根据前面的规则执行比较var result="Brick"<"alphabet";//true
//字母B的字符编码为66,二字母a的字符编码为97
var result="23"<"3";//true
//两个操作数都是字符串,而字符串比较的是字符编码("2"的字符编码是50,而"3"的字符编码是51)
var result="23"<3;//false
//在比较字符串和数值时,字符串都会被转换为数值,然后再以数值的形式与另一个数值进行比较
var result="a"<3;//false
//由于字母a不能转换为合理的数值,因此被转换成了NaN
var result1=NaN<3;//false
var result2=NaN>=3;//false
//按照常理,如果一个值不小于另一个值,则一定是大于或等于另一个值。在与NaN比较时,都返回了false
七、相等操作符
==
)==
),如果两个操作数相等,则返回true
!=
),如果两个操作数不相等,则返回true
false
转换 为0,true
转换为1valueOf()
方法,用得到的基本类型值按照前面的规则进行比较null
和undefined
是相等的null
和undefined
转换成其它任何值NaN
,则相等操作符返回false
,而不相等操作符返回true
(即使两个操作数都是NaN
,相等操作符返回false
,因为按照规则,NaN
不等于NaN
)true
;否则,返回false
表达式 | 值 | 表达式 | 值 |
---|---|---|---|
null==undefined |
true |
true==1 |
true |
"NaN"==NaN |
false |
true==2 |
false |
5==NaN |
false |
undefined==0 |
false |
NaN==NaN |
false |
null==0 |
false |
NaN!=NaN |
true |
"5"==5 |
true |
false==0 |
true |
===
)===
),只在两个操作数未经转换就相等的情况下返回true
!==
),在两个操作数未经转换就不相等的情况下返回true
null==undeifned
会返回true
,因为它们是类似的值;但null===undefined
会返回false
,因为它们是不同类型的值var result1=("55"==55);//true,转换后相等
var result2=("55"===55);//false,不转换,字符串不等于数值
var result1=("55"!=55);//false,转换后相等
var result2=("55"!==55);//true,不转换,字符串不等于数值
八、条件操作符
表达式?true:false;
var max=(num1>num2)?num1:num2;
//如果num1>num2(关系表达式返回true),则将num1的值赋给max;如果num1小于或等于num2(关系表达式返回false),则将num2的值赋给max
九、赋值操作符
=
),将右侧的值赋给左侧的变量=
)前面在添加乘性操作符、加性操作符或位操作符,就可以完成复核赋值操作*
)赋值:*=
/
)赋值:/=
%
)赋值:%=
+
)赋值:+=
-
)赋值:-=
<<
):<<=
>>
)赋值:>>=
>>>
)赋值:>>>=
十、逗号操作符
,
)可以在一条语句中执行多个操作var num=(5,1,4,8,0);//num的值为0
//由于0是表达式中的最后一项,因此num的值就是0
源于整理《JavaScript高级程序设计》