《JavaScript高级程序设计》学习笔记(运算符)
一元运算符
一元运算符只有一个参数,即要操作的对象或值。
1. delete
delete运算符删除对以前定义的对象属性或方法的引用
delete运算符不能删除开发者未定义的属性和方法,否则会出错
例子:
var o = new Object;
o.name = "cloud";
delete o.name;
删除了name属性,将其设置为undefined。
2. void
void运算符对任何值都返回undefined。
该运算符通常用于避免输出不应该输出的值
例如:
从HTML的<a>元素调用JavaScript函数时不能返回有效值,否则浏览器只显示函数结果
<a href="javascript:document.body.scrollTop=0;">顶部</a>
应该用void运算符调用函数,使函数调用返回undefined,它不会显示在浏览器窗口
<a href="javascript:void(document.body.scrollTop=0);">顶部</a>
注意:没有返回值的函数真正返回的都是undefined
3. 前增量/前减量运算符
前增量运算符是在数值上加1,形式:++variable
例子:
var iNum = 10;
++iNum; //把iNum增加到了11,等价于:iNum = iNum + 1;
前减量运算符是从数值上减1,形式:--variable
例子:
var iNum = 10;
--iNum; //把iNum减到9,等价于:iNum = iNum - 1;
注意:增量和减量运算都发生在计算表达式之前,即先进行前缀式运算符运算再进行其它计算
这是区别后缀式运算符的地方
例子:
var iNum = 10;
alert(++iNum); //这里显示的是11,说明在iNum在计算输出之前已经进行了前增量运算
在算术表达式中,前增量和前减量运算符的优先级是相同的,要按照从左到右的顺序计算
4. 后增量/后减量运算符
前增量运算符是在数值上加1,形式:variable++
例子:
var iNum = 10;
iNum++; //把iNum增加到了11,等价于:iNum = iNum + 1;
前减量运算符是从数值上减1,形式:variable--
例子:
var iNum = 10;
iNum--; //把iNum减到9,等价于:iNum = iNum - 1;
与前缀式运算符不同,后缀式运算符是在计算过包含它们的表达式后才进行增量或减量运算的
例子:
var iNum = 10;
alert(iNum++); //这里显示的是10,说明在iNum在计算输出之前,没有进行后增量运算
alert(iNum); //这里显示的是11,说明在iNum在前一次计算输出之后,进行了后增量运算
在算术表达式中,后增量和后减量运算符的优先级是相同的,要按照从左到右的顺序计算
5. 一元加法和一元减法
一元加法本质上对数字无任何影响
尽管一元加法对数字无作用,但用在字符串,会把字符串转换成数字
例子:
var iNum = "10";
alert(typeof(iNum));//string
iNum = +iNum;
alert(typeof(iNum));//number
这里把iNum从string强制转换成number
当一元加法运算符对字符串进行操作时,作用与parseInt()相似,
主要的不同是只有对以"0x"开头的字符串(表示十六进制数字),一元运算符才把它转换成十进制的值。因此,用一元加法转换"010",得到的总是10,而"0xB"将被转换成11。
一元减法就是对数值求负
例子:
var iNum = "10";
iNum = -iNum;//得到的是-10
与一元加法运算符相似,一元减法运算符也会把字符串转换成近似的数字,此外还会对该值求负。例如:
var iNum = "10";
iNum = -iNum;//得到的是数字型的-10
一元减法运算符对十六进制值和十进制的处理方式与一元加法运算符相似,只是它还会对该值求负
位运算符
2. 位运算NOT
位运算NOT由否定号(~)表示
处理过程:
(1) 把运算数转换成32位数字;
(2) 把二进制形式转换成它的二进制反码,即把二进制的0改为1,把1改为0;
(3) 把二进制反码转换成浮点数。
例子:
var b=2;
var a=~b;
alert(a);//得到-3
位运算NOT实质上是对数字求负,然后减1(对数字求负是取数字二进制形式反码再加1)
因此相当于:
var a=-b-1;
3. 位运算AND
位运算AND由和号(&)表示
规则:
__________________________________________________________
第一个数字中的数位 第二个数字中的数位 结果
__________________________________________________________
1 1 1
1 0 0
0 1 0
0 0 0
__________________________________________________________
例子:
var a=11;//1011
var b= 7;//0111
alert(a & b);//结果是3,即二进制的0011
4. 位运算OR
位运算OR由符号(|)表示
规则:
__________________________________________________________
第一个数字中的数位 第二个数字中的数位 结果
__________________________________________________________
1 1 1
1 0 1
0 1 1
0 0 0
__________________________________________________________
例子:
var a=11;//1011
var b= 7;//0111
alert(a | b);//结果是15,即二进制的1111
5. 位运算XOR
位运算XOR由符号(^)表示
XOR不同于OR,当只有一个数位存放的是1时,它才返回1。真值表如下:
__________________________________________________________
第一个数字中的数位 第二个数字中的数位 结果
__________________________________________________________
1 1 0
1 0 1
0 1 1
0 0 0
__________________________________________________________
例子:
var a=11;//1011
var b= 7;//0111
alert(a ^ b);//结果是12,即二进制的1100
6. 左移运算
左移运算由两个小于号表示(<<)
把数字中的所有数位向左移动指定的数量
例子:
var a=2; //0010
var b= a<<1; //0100
把数字2(等于二进制中的0010)左移1位,结果为4(等于二进制中的0100)
注意:左移操作保留数字的符号位。例如,如果把-2左移1位,得到的是-4,而不是4
7. 有符号右移运算
有符号右移运算符由两个大于号(>>)表示
它将把32位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。
有符号右移运算恰好与左移运算相反。例如,把64右移5位,将变为2:
8. 无符号右移运算
无符号右移由三个大于号(>>>)表示
它将把无符号32位数中的所有数位整体右移。
对于正数,无符号右移运算的结果与有符号右移运算一样。
对于负数,无符号右移运算也是用0填充所有空位。
由于代表负数的符号由1变成0,所以负数的无符号右移运算得到的总是一个非常大的正数
例如,如果把-64右移5位,将得到134217726
Boolean运算符
Boolean运算符与等式运算符同等重要,通常用在像if...else和循环这样的语句中
1. 逻辑NOT
逻辑NOT运算符由感叹号(!)表示
与逻辑OR和逻辑AND运算符不同的是,逻辑NOT运算符返回的一定是Boolean值。
行为:
_________________________________________
运算数 返回
_________________________________________
对象 false
数字0 true
0以外的任何数字 false
null true
NaN true
undefined 出错
_________________________________________
例子:
var n = 0;
while(!n){
n++;
}
当n不为0时停止循环
在一行代码中使用两个逻辑NOT运算符,无论运算数是什么类型的,第一个NOT运算符返回Boolean值。第二个NOT将对该Boolean值求负,从而给出变量真正的Boolean值。
例子:
var n = -2;
while(!!n){
n++;
}
当n为0时停止循环
2. 逻辑AND运算符
逻辑AND运算符用双和号(&&)表示
行为:
_________________________________________
运算数1 运算数2 返回
_________________________________________
true true true
true false false
false true false
false false false
对象 Boolean值 对象
对象1 对象2 对象2
null null null
NaN NaN NaN
其中一个是undefined 出错
_________________________________________
逻辑AND运算是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数。
对于逻辑AND运算来说,如果第一个运算数是false,那么就直接返回false,而不考虑后面的运算
例子:
var a = true;
alert(a && b);
这里会出错,因为b是未定义变量
var a = false;
alert(a && b);
这里会显示false,不会出错,因为a已经是false,所以后面就不需要再运算了
在使用逻辑AND运算符时,记住它的这种简便计算特性,以便优化语句
3. 逻辑OR运算符
逻辑OR运算符由双竖线(||)表示
行为:
_________________________________________
运算数1 运算数2 返回
_________________________________________
true true true
true false true
false true true
false false false
对象 Boolean值 对象
Boolean值 对象 对象
对象1 对象2 对象1
其中一个是null null
其中一个是NaN NaN
其中一个是undefined 出错
_________________________________________
与逻辑AND运算相同,逻辑OR运算也是简便运算
例子:
var a = false;
alert(a || b);
这里会出错,因为b是未定义变量
var a = true;
alert(a || b);
这里会显示true,不会出错,因为a已经是true,所以后面就不需要再运算了
乘性运算符
1. 乘法运算符
乘法运算符由星号(*)表示
用于两个数相乘
特殊行为:
如果结果太大或太小,那么生成的结果就是Infinity或-Infinity。
如果某个运算数是NaN,结果为NaN。
Infinity乘以0,结果为NaN。
nfinity乘以0以外的任何数字,结果为Infinity或-Infinity,由第二个运算数的符号决定。
Infinity乘以Infinity,结果为Infinity。
2. 除法运算符
除法运算符由斜线(/)表示
用第二个运算数除第一个运算数
特殊行为:
如果结果太大或太小,那么生成的结果就是Infinity或-Infinity。
如果某个运算数是NaN,结果为NaN。
Infinity被Infinity除,结果为NaN。
Infinity被任何数字除,结果为Infinity。
0除一个非无穷大的数字,结果为NaN。
Infinity被0以外的任何数字除,结果为Infinity或-Infinity,由第二个运算数的符号决定。
3. 取模运算符
取模(余数)运算符由百分号(%)表示
特殊行为:
如果运算数都是数字,执行常规的算术除法运算,返回除法运算得到的余数。
如果被除数是Infinity,或者除数是0,结果为NaN。
Infinity被Infinity除,结果为NaN。
如果除数是无穷大的数,结果为被除数。
如果被除数为0,结果为0。
加性运算符
1. 加法运算符
加法运算符由加号(+)表示
特殊行为:
某个运算数是NaN,结果为NaN。
Infinity加Infinity,结果为Infinity。
-Infinity加-Infinity,结果为-Infinity。
Infinity加-Infinity,结果为NaN。
+0加+0,结果为+0。
-0加+0,结果为+0。
-0加-0,结果为-0。
如果两个运算数都是字符串,把第二个字符串连接到第一个字符串上。
如果只有一个运算数是字符串,把另一个运算数转换成字符串,结果是两个字符串连接成的字符串。
注意:在使用加法运算符时,一定要仔细检查运算数的数据类型。
2. 减法运算符
减法运算符由减号(-)表示
特殊行为:
如果两个运算数都是数字,将执行算术减法,返回结果。
某个运算数是NaN,结果为NaN。
Infinity减Infinity,结果为NaN。
-Infinity减-Infinity,结果为NaN。
Infinity减-Infinity,结果为Infinity。
-Infinity减Infinity,结果为-Infinity。
+0减+0,结果为+0。
-0减-0,结果为-0。
-0减-0,结果为+0。
某个运算数不是数字,结果为NaN。
关系运算符
关系运算符小于(<)、大于(>)、小于等于(<=)和大于等于(>=)执行的是两个数的比较运算
比较方式与算术比较运算相同。每个关系运算符都返回一个Boolean值:
对于字符串,第一个字符串中每个字符的代码都会与第二个字符串中对应位置上的字符的代码进行数值比较,对应字符代码相同的话会用下一个位置的字符比较,直到返回一个Boolean值。
注意:
(1)大写字母的代码都小于小写字母代码,所以要注意大小写字符的情况,或者转换成相同的大小写形式再比较
(2)在比较两个字符串形式的数字时,要按字符串的情况比较,
例如:"23" < "3",将返回 "true"
(3)在比较一个数字和一个字符串时,会把字符串转换成数字,然后按照数字规则比较
例如:"23" < 3,将返回 "false"
(4)在比较一个数字和一个字符串时,如果字符串不能转换成数字,将输出false
因为这时字符串转换成"NaN",根据规则,任何包含NaN的关系运算都要返回false
等性运算符
1. 等号和非等号
等号由双等号(==)表示
当且仅当两个运算数相等时,它返回true
非等号由感叹号加等号(!=)表示
当且仅当两个运算数不相等时,它返回true
为确定两个运算数是否相等,这两个运算符都会进行类型转换
类型转换规则:
运算数1 运算数2 结果
__________________________________________________________
Boolean值 false转换成0,true转换成1
字符串 数字 把字符串转换成数字
对象 字符串 把对象转换成字符串(用toString)
对象 数字 把对象转换成数字
__________________________________________________________
比较规则:
(1)值null和undefined相等。
(2)在检查相等性时,不能把null和undefined转换成其他值。
(3)如果某个运算数是NaN,等号将返回false,非等号将返回true。
重要提示:即使两个运算数都是NaN,等号仍然返回false,因为根据规则,NaN不等于NaN
(4)如果两个运算数都是对象,那么比较的是它们的引用值。
如果两个运算数指向同一个对象,那么等号返回true,否则两个运算数不等。
下表列出了一些特殊情况及它们的结果:
表达式 值
__________________________________
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
__________________________________
2. 全等号和非全等号
全等号由双等号(===)表示
只有在无需类型转换运算数就相等的情况下,才返回true
非全等号由感叹号加等号(!==)表示
只有在无需类型转换运算数不相等的情况下,才返回true
全等号和非全等号的作用与等号和非等号相同,但它们检查相等性前,不执行类型转换
例子:
alert("5" == 5;)//返回true
alert("5" === 5;)//字符串不等于数字,返回"false"
条件运算符
根据条件执行两个语句中的其中一个
variable = boolean_expression ? true_value : false_value
根据boolean_expression的计算结果有条件的为变量赋值。
如果boolean_expression为true,就把true_value赋给变量,
如果它是false,就把false_value赋给变量。
赋值运算符
简单的赋值运算由等号(=)实现,只是把等号右边的值赋予等号左边的变量。
复合赋值运算是由乘性运算符、加性运算符或位移运算符加等号(=)实现的。
复合赋值运算符:
表达式 意义
__________________________________
*= 乘法/赋值
/= 除法/赋值
%= 取模/赋值
+= 加法/赋值
-= 减法/赋值
<<= 左移/赋值
>>= 有符号右移/赋值
>>>= 无符号右移/赋值
__________________________________
逗号运算符
用逗号运算符可以在一条语句中执行多个运算
例子:var a=1,b=2,c=3;
逗号运算符最常用于变量声明中