首页 > 代码库 > JavaScript高级程序设计(3)基本概念 中

JavaScript高级程序设计(3)基本概念 中

  操作符

 ECMA-262描述了一组用于操作数据值的操作符,包括算数操作符、位操作符、关系操作符和相等操作符。他们能够适应很多值,例如字符串、数字值、布尔值甚至对象。在应用对象时,相应的操作符都会调用对象的valueof()和toString()方法。取得可以操作的值。

 

 一元操作符:只能操作一个值。

 1.递增和递减操作符。   

  前置性(++i):++位于要操作的变量之前 变量先加1,然后赋值给左边的变量。

  后值性(i++):++位于要操作的变量之后 ,先赋给左边的变量,然后再+1。

  递减同理;

var  num1 = 2;
var  num2 = 20;
var  num3 = --num1 + num2;           //等于21
var  num4 =  num1 + num2;            //等于21

var num5  = num1-- +num2;            //等于22 
var num6  = num1 + num2;             //等于21

他们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。应用不同的值有不同的规则。

  1.   一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字符串变量变成数值变量。
  2.   一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
  3.   布尔值为false,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
  4.   布尔值true,先将其转换为 1 再执行加减 1 的操作。布尔值变成数值变量。
  5.   浮点数值时,执行加减 1 的操作。
  6.   对象时,先调用对象的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

 

 2.一元加和减操作符

以一个加号(+)表示,放在数值前面,对数值不会产生任何影响。非数值前面,会对这个值进行转换。

以一个减号(-)表示,放在数值前面,变成负数。非数值前面,对这个值进行转换,变成负数。

 

 位操作符

  按位非(NOT) 波浪线(~)表示,结果是返回数值的反码。

  按位于(AND) 和号字符(&)表示,只在两个数值的对应位都是 1 时才返回 1 ,任何一位是 0 ,结果都是 0 。

  按位或(OR)   竖线符号(|)表示,有一个位是 1 的情况下就返回 1 ,而只有在两个位都是 0 的情况下才返回 0 。

  按位异或(XOR) 插入符号(^)表示,两个数值对应位上只有一个 1 时才返回 1 ,如果对应的两位都是 1 或都是 0 ,则返回 0 。

  左移  两个小于号(>>)表示,会将数值的所有位向左移动指定的位数。不会影响操作数的符号位

  有符号右移  两个大于号(<<)表示,会将数值向右移动,会用符号位填充所有空位。

  无符号右移  三个大于号(<<<)表示,二进制数向右移位,直接右移,对于正数,结果和>>相同,对于负数,会把负数的二进制补码当成正数的二进制码处理

 

布尔操作符

 逻辑非(NOT):叹号(!)表示,将它的操作数转换为一个布尔值,然后再对其求反。

 

 同时使用两个逻辑非操作符,可以将值转换为真正的布尔值。

 

逻辑与(AND):两个和号(&&)表示。

 当两个操作数相应的Boolean值均为true时,返回true;有一个false,都会返回false。

 短路操作:如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。

 

逻辑或(AND):两个竖线符号(||)表示。

当两个操作数相应的Boolean值均为false时,返回false;有一个true,都会返回true。

短路操作:第一个操作结果为true,就不会对第二个操作数求值了。

 

计算操作符

  乘法操作符由一个星号(*)表示,计算两个数值的乘积。

  除法操作符由一个斜线符号(/)表示,执行第二个操作数除第一个操作数的计算。

  求模(余数)操作符由一个百分号(%)表示。执行常规的除法计算,返回除得的余数

  加性操作符(+)

    如果是数值,执行常规的加法计算。

    如果有字符串,则会拼接起来。添加圆括号(),就可以对数值执行算术计算,然后再将结果与字符串拼接起来。

 减法操作符(-)

   如果是数值,执行常规的减法计算,

  如果是其他,则会转换,在进行计算

 

1、除了加(+)之外,如果操作数不是Number类型,会自动调用Number()转换为Number类型再进行计算。

2、对于加减(+-),除了作为算术运算符。还可以作为一元操作符(见上)。当然,由于字符串操作中对加号(+)的重载,还可以用于将任意数值(的字符串)相连,这也是第1点中为什么要除了加(+),它在含有非Number类型值时,会将所有操作数转换为字符串相连接。

3、与一般类C语言不同,在ES中,除(/)和取模(%)并不会区分整数和浮点数,比如 5 / 2 = 2.5 而不是2,5.3 % 3 = 2.3 而不是2。

4、任意运算,只要操作数含NaN,结果就是NaN。但并不是结果为NaN就一定有一个操作数为NaN,比如0/0也返回NaN。

5、对于含无穷Infinity的运算,规定比较多,这里就不列举了,可以参考原书,或者自行测试。

 

关系操作符

小于(<)、大于(>)、小于等于(<=)和大于等于(>=)对两个值进行比较,都会返回一个布尔值。

 1.如果两个操作数都是数值,则执行数值比较。

 2.如果两个操作数都是字符串,则比较相对应的字符编码值。

 3、操作符是对象时,调用valueOf()(如果没有,就调用toString()),再将结果按上面规则比较。

 4、任意数和NaN比较返回false。

 

相等操作符

 等于号(==) 不等于(!=) 先转换操作数,然后再比较它们的相等性。

全等(===)  不全等(!==)不会转换操作数,直接比较。

      a===b则一定有a==b,而a!=b则一定有a!==b。

 

条件操作符

variable = boolean_expression ? true_value : false_value;

 该表达式主要是根据 boolean_expression 的计算结果有条件地为变量赋值。如果 Boolean_expression 为 true,就把 true_value 赋给变量;如果它是 false,就把 false_value 赋给变量。

 

赋值操作符(=)  右则的值赋给左侧的变量。

每种主要的算术运算以及其他几个运算都有复合赋值运算符:

  • 乘法/赋值(*=)
  • 除法/赋值(/=)
  • 取模/赋值(%=)
  • 加法/赋值(+=)
  • 减法/赋值(-=)
  • 左移/赋值(<<=)
  • 有符号右移/赋值(>>=)
  • 无符号右移/赋值(>>>=)

 

逗号操作符

 使用逗号操作符可以在一条语句中执行多个操作。

var iNum1 = 1, iNum = 2, iNum3 = 3;

 多用于声明多个变量。

 

JavaScript高级程序设计(3)基本概念 中