5.1 什么是表达式?
表达式就是javascript的一个“短语”,javascript的解释器可以计算,从而生成一个值。
5.2 运算符概述
javascript运算符包括:关键字运算符和标点运算符
下面的表会给出运算符的优先级(优先级控制执行操作的顺序),结合性等。
p列给出运算符的优先级,数字较大的优先级高于数字较小的。A列给出运算符的结合性,结合性L(从左到右),R(从右到左),运算符的的说明放在后面讨论。
5.2.1 运算数的个数
大多数是二元运算符,例如常用的+,-;
一元运算符,常用的-,表示是对值取反;
三元运算符,条件运算符? :;
5.2.3 运算符的优先级
在表5-1中,p数字较大的运算符的优先级大于p数字较小的运算符的优先级。
5.2.4 运算符的结合性
一个优先级相同,按照运算符的结合性去执行。
一元运算符,赋值运算符,三元条件运算符的结合性是从右到左。
5.3 算数运算符
算术运算符用于执行变量与/或值之间的算术运算。
给定 y=5,下面的表格解释了这些算术运算符:
运算符 描述 例子 结果
+ 加 x=y+2 x=7
- 减 x=y-2 x=3
* 乘 x=y*2 x=10
/ 除 x=y/2 x=2.5
% 求余数 (保留整数) x=y%2 x=1
++ 累加 x=++y x=6
-- 递减 x=--y x=4
疑点剖析:i++和++i的区别
- ++i 的用法(以 a=++i ,i=2 为例)
先将 i 值加 1 (也就是 i=i+1 ),然后赋给变量 a (也就是 a=i ),
则最终 a 值等于 3 , i 值等于 3 。
所以 a=++i 相当于 i=i+1 ,a=i
- i++ 的用法(以 a=i++ ,i=2 为例)
先将 i 值赋给变量 a (也就是 a=i ),然后 i 值加 1 (也就是 i=i+1 ),
则最终 a 值等于 2 ,i 值等于 3 。
所以 a=i++ 相当于 a=i , i=i+1
- ++i 与 i++
a=++i 相当于这两句 i+1 , a=i
a=i++ 相当于这两句 a=i , i+1
var i=1 var j= i++;//执行 j=i,i=i+1 alert(j);//结果为1 alert(i);//结果为2
var i=1 var j= ++i;//执行i=i+1,j=i alert(j);//结果为2 alert(i);//结果为2
- ++i 与 i++ 单独使用时,相当于 i=i+1
如果赋给一个新变量,则 ++i 先将 i 值加 1 ,而 i++ 先将 i 赋给新变量。
5.4 等性运算符
判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。
JavaScript提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。
等号和非等号
在 JavaScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。
非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。
为确定两个运算数是否相等,这两个运算符都会进行类型转换。
执行类型转换的规则如下:
- 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
- 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
- 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
- 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则:
- 值 null 和 undefined 相等。
- 在检查相等性时,不能把 null 和 undefined 转换成其他值。
- 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
- 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。
下表列出了一些特殊情况,以及它们的结果:
表达式 值 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
全等号和非全等号
等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。
全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。
例如:
var sNum = "66"; var iNum = 66; alert(sNum == iNum); //输出 "true" alert(sNum === iNum); //输出 "false"
在这段代码中,第一个 alert 使用等号来比较字符串 "66" 和数字 66,输出 "true"。如前所述,这是因为字符串 "66" 将被转换成数字 66,,然后才与另一个数字 66 进行比较。第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字,当然,字符串不等于数字,所以输出 "false"。
非全等号由感叹号加两个等号(!==)表示,只有在无需类型转换运算数不相等的情况下,才返回 true。
例如:
var sNum = "66"; var iNum = 66; alert(sNum != iNum); //输出 "false" alert(sNum !== iNum); //输出 "true"
这里,第一个 alert 使用非等号,把字符串 "66" 转换成数字 66,使得它与第二个运算数 66 相等。因此,计算结果为 "false",因为两个运算数是相等的。第二个 alert 使用的非全等号。该运算是在问:"sNum" 与 "iNum" 不同吗?这个问题的答案是:是的(true),因为 sNum 是字符串,而 iNum 是数字,它们当然不同。
5.5关系运算符
- JavaScript关系运算符负责判断两个值是否符合给定的条件,
- JavaScript关系运算符包括
比较运算符(
>,<,>=,<=,!=,==,===,!==;
),in运算符,instanceof运算符。 - 用关系运算符和运算对象(操作数)连接起来,符合规则的JavaScript语法的式子,称JavaScript关系表达式;
- JavaScript关系表达式返回的值为true(正确[真])或false(错误[假]);
5.5.1JavaScript比较运算符包括>,<,>=,<=,!=,==,===,!==;
JavaScript比较运算符与关系表达式
容易混淆的知识点:===与!==
===代表恒等于,不仅判断数值,而且判断类型。
比如
var a=5,b="5"; //a是数值类型,b是字符串类型,虽然数值相等但是类型不等。 document.write(a==b); //返回true,数值上相等 document.write(a===b); //返回false,虽然树枝上相等,但是类型不同
!==代表恒不等于,也是要判断数值与类型。
比如
var a=5,b="5";// document.write(a!=b);//返回false,数值上相等 document.write(a!==b);//返回true,虽然数值上相等,但是类型不同
5.5.2 in运算符
判断对象是否为数组/对象的元素/属性;
格式:(变量 in 对象),
当“对象”为数组时,“变量”指得是数组的“索引”;
当“对象”为对象时,“变量”指的是对象的“属性”。
var arr = ["a","b","2","3","str"]; var result = ("b" in arr);//结果为false var result1 = (4 in arr);//结果为true
5.5.3 instanseof运算符
- 用于判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例;
- 返回boolean类型;
- 语法为 0 instanceif A。
例如
1 <script type="text/javascript"> 2 <!– 3 alert("typeof(1):" + typeof(1));//number 4 alert("typeof(\"abc\"):" + typeof("abc"));//string 5 alert("typeof(true):" +typeof(true));//boolean 6 alert("typeof(2009-2-4):" + typeof(2009-2-4));//number 7 alert("typeof(\"2009-2-4\"):" + typeof("2009-2-4"));//string 8 alert("typeof(m):" + typeof(m));//undefined 9 var d=new Date(); 10 alert("typeof(d):" + typeof(d));//object 11 function Person(){}; 12 alert("typeof(Person):" + typeof(Person));//function 13 var a=new Array(); 14 alert("typeof(a):" + typeof(a));//object 15 alert("a instanceof Array:" + (a instanceof Array)); 16 var h=new Person(); 17 var o={}; 18 alert("h instanceof Person:" + (h instanceof Person));//true 19 alert("h instanceof Object:" + (h instanceof Object));//true 20 alert("o instanceof Object:" + (o instanceof Object));//true 21 alert(typeof(h));//object 22 //–> 23 </script>
5.6逻辑运算符
- 包括逻辑与(&&)运算符、逻辑或(||)运算符,逻辑非(!)运算符;
- 用于测定变量或值之间的逻辑。
给定 x=6 以及 y=3,下表解释了逻辑运算符:
运算符 描述 例子 用法说明 && and (x < 10 && y > 1) 为 true 只有在两边表达式都为true时,结果才为ture || or (x==5 || y==5) 为 false, 两个表达式有一个为true时,结果为true,否则为false ! not !(x==y) 为 true, 表达式为true,结果为false,反之亦然
5.7 位运算符
- 按位运算符是把操作数看作一系列单独的位,而不是一个数字值。解释下什么是“位”,数值或字符在内存内都是被存储为0和1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内被存储为 0 0 0 0 0 0 1 0,当我们将内存内的位值改变之后,这个值代表的意义也就变了,比如把2前移动一位, 现在存储单元里面变成了0 0 0 0 0 1 0 0,这个值表示的是十进制的4,这也就是按位操作符的运算原理
- 包括:& 按位与、|按位或、^按位异或、~取反、>>右移、<<左移
5.7.1 & 运算符
&是二元运算符,它以特定的方式的方式组合操作数中对应的位 如果对应的位都为1,那么结果就是1, 如果任意一个位是0 则结果就是0
1 & 3的结果为1
来看看它的怎么运行的:
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
根据 & 的规则 得到的结果为 0 0 0 0 0 0 0 1,十进制表示就是1
只要任何一位是0 &运算的结果就是 0,所以可以用&把某个变量不必要的位设为0, 比如某个变量的二进制表示为 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位 用 & 0x0F就可以了(住:0x0F为16进制表示法,对应的二进制为 0 0 0 0 1 1 1 1)。
5.7.2 | 运算符
| 跟 & 的区别在于 如果对应的位中任一个操作数为1 那么结果就是1
1 | 3 的结果为3
5.7.3^ 运算符
^运算符跟 | 类似,但有一点不同的是 如果两个操作位都为1的话,结果产生0
0 1 0 0 0 0 0 1
0 1 0 1 1 0 1 0
产生 0 0 0 1 1 0 1 1
5.7.4 ~ 运算符
~是对位求反 1变0, 0变1
5.7.5 移位运算符移位运算符把位按指定的值向左或向右移动
<< 向左移动 而 >> 向右移动,超过的位将丢失,而空出的位则补0
如 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1(十进制16387) 向左移动两位将变成
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 (十进制12)
向右移动两位则是
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0(十进制4096)
5.8 赋值运算符
- JavaScript赋值运算符负责为变量赋值;
- JavaScript赋值运算符包括
=,+=,-=,*=,/=,%=
JavaScript赋值运算符与赋值表达式