javascript权威指南,第5章,表达式和运算符

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赋值运算符与赋值表达式

原文地址:https://www.cnblogs.com/huanhuan8808/p/3054207.html