JavaScript操作符

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符、位操作符、关系操作符和相等操作符。
特点能够适用于很多的值,例如字符串、数字值、布尔值,甚至对象。
 
操作符的优先级:逻辑非 ! 、算术 +-*/%、关系、逻辑与和逻辑或、条件操作符、赋值操作符
 
一元操作符
 
只能操作一个值的操作符叫做一元操作符。
 
1.递增递减操作符
 
各有两个版本:前置型和后置型。如下所示:
 
var age = 29;
++age;
 
在这个例子中,前置递增操作符把age的值变成了30(为29加上1)。
实际上。执行这个前置题赠操作符与执行以下操作的效果相同:
 
var age = 29;
age = ++age + 1;
 
执行前置递减操作的方法也类似,结果会从一个数值中减去1.使用前置递减操作符时,要把
两个减号(--)放在相应的变量前面,如下所示:
 
var age  = 29;
--age;
 
备注:执行前置递增和递减时,变量的值都是在语句被求值以前改变。
例如:
 
var age = 29;
 
var anotherAge = --age + 2 
 
alert(age);   // 输出28
alert(another); // 输出30
 
这个例子,先执行了减法操作,age的值变成28,所以加上2就结果就等于30。
 
由于前置递增和递减操作与执行语句的优先级相等,因此整个语句从左到右被求值。再看下一个例子:
 
var num1 = 2;
var num2 = 20;
var num3 = --num1+num2;       //  等于21
var num4 = num1+num2;        //  等于21
  
num4等于21,是因为使用了num1先减去1后的值。
 
后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过是放在变量的后面而不是前面
 
前置和后置的最大区别在于,后置递增是在包含它们的语句被求值之后才执行的。这个区别在某些情况下不是什么问题,例如:
 
var age = 29;
age++;
 
所有这4个操作符对任何值都适用,也就不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于不同的值时,递增和递减操作符遵循下列规则。
 
1.在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
 
备注:默认使用Number()方法进行转换
 
2.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
 
3.在应用于布尔值false时,先将其转换为0再执行加减1的操作,布尔值变量变成数值变量。
 
4.在应用于布尔值true时,先将其转换为1再执行加减1的操作,布尔值变量变成数值变量。
 
5.在应用于浮点数值时,执行加减1的操作。
 
6.在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后
 
2.一元加和减操作符
 
一元加操作符放在数值面前,对数值不会产生任何影响。
 
而非数值型应用一元加操作符时,该操作符会像Number()函数一样对这个值执行类型转换。如下例子:
 
var s1 = "0.1";
var s2 = "z";
var s3 = false;
 
console.log(s1);   --- 0.1
console.log(s2);   --- NaN
console.log(s3);   --- 0
 
一元减操作符主要用于表示负数。如下例子,进行了简单的转换:
 
var  num = 25;
 
console.log(-25);  ----25
 
 
位操作符
 
位操作符用于最基本的层次上,即按内存中的表示位的操作数值。
 
对于有符号整数,32位中的前31位表示整数的值,第32位表示数值的符号:0表示整数,1表示负数。这个表述符号的位表示符号位。符号位决定了其他位数的格式。
 
其中,整数以纯二进制格式存储。如18的二进制表示是10010,没用到的位数用0表示,即忽略不计。这个是5个有效位,这5位本身就决定了实际的值。
 
负数同样以二进制码存储,但使用的是二进制的补码。计算一个值的二进制补码,需要经过3个步骤。
 
(1).求这个数值绝对值的二进制码。
 
(2).求二进制的反码,即将0替换为1,将1替换为0。
 
(3).得到的二进制反码加1。
 
根据前面的3步骤求得-18的二进制,首先就要求得18的二进制码,即:
 
0000  0000  0000  0000  0000 0000  0001  0010
 
然后,求其二进制反码,即0和1互换:
 
1111  1111  1111 1111  1111 1111  1110 1101
 
最后二进制反码加1:
 
1111  1111  1111 1111  1111 1111  1110 1110
 
这样就求得-18的二进制表示。
 
ECMAScript会尽力向我们隐藏所有的这些信息。换句话说,以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码在前面加上负号。
 
1.按位非(NOT)
 
按位非由一个波浪线(~)表示,执行按位非得结果就是返回数值的反码。
 
var  num1 = -18;    //  二进制1111  1111  1111  1111   1111   1111  1110  1110

var  num2 = ~num1  // 反码 0000  0000  0000  0000   0000   0000  0001  0010

console.log(~num);  //  17
 
按位非操作的本质:操作数的负值减1。下面的代码也可以得到相同结果:
 
var num1 = -18;
 
var num2  = -num1 - 1;
 
console.log(num2);
 
2.按位与(AND)
 
按位与操作符由一个和号字符(&)表示,它有两个操作数。从本质讲,按位与操作就是将两个数值的每一位对齐,然后下面的表中的规则,对相同位置的两个数执行and操作。
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 0
0 0 0
0 1 0
 
简而言之,按位与操作符只有在两个对应位都是 1时才会返回1,任何一位是0,结果都是0。如下示例:
 
var result = 25 & 3;

console.log(result);   ---输出为1
 
具体操作
 
25      = 0000  0000 0000 0000 0000 0000 0001 1001
  3      = 0000  0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
AND   = 0000  0000 0000 0000 0000 0000 0000 0001
 
结果为1
 
 
3.按位或
 
按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或遵行下面这个真值表。
第一个数值的位 第二个是数值的位 结果
1 1 1
1 0 1
0 1 1
0 0 0
由此可见,按位或擦操作在有一个位是1的情况下返回1,而只有两个位都是0才返回0。
 
如前面的按位与例子的例子中对25和3执行按位或操作,则具体代码如下:
 
var result = 25  |  3;

console.log(result);   ---输出为27
 
具体操作
 
25      = 0000  0000 0000 0000 0000 0000 0001 1001
  3      = 0000  0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
AND   = 0000  0000 0000 0000 0000 0000 0001 1011
 
结果为27
 
 
4.按位异或
 
按位异或操作符由一个插入符号(^)表示,也有两个操作数,以下是按位异或的真值表。
第一个值的位 第二个值的位 结果
1 1 0
1 0 1
0 1 1
0 0 0
 
按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个1时才返回1,如果相对应的两位都是1或都是0,则返回0
 
对25和3执行按位异或操作的代码如下所示:
 
var result = 25  |  3;

console.log(result);   ---输出为26
 
25      = 0000  0000 0000 0000 0000 0000 0001 1001
  3      = 0000  0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
AND   = 0000  0000 0000 0000 0000 0000 0001 1010
 
左移
 
左移操作符由两个小于号(<<)表示,这个操作符会将所有的数值的所有位向左移指定的位数。例如,如果将数值2向左移5位,结果就是64.具体代码如下:
 
var oldNum = 2;
var newNum  = oldNum <<5;    // 等于二进制的100 0000   输出十进制的64
 
备注:在向左位移后,原数值的右侧会对出几个空位。左移操作会以0来填充这些位,以便得到的结果是一个完整的32位二进制数。
 
0000  0000  0000  0000  0000  0000  0000 0010  
 
0000  0000  0000  0000  0000  0000  0100 0000
 
备注:左移不会影响操作数的符号位,也就是说,如果-2左移5位,得到的结果将会是-64,而非64。
 
 
有符号右移
 
有符号的右移操作符由两个大于号(>>)表示,这个操作符将数值向右移动,但保留符号位(即正负号标记),
 
 
布尔操作符
 
1.逻辑非
 
优先级最高
 
逻辑非操作符由一个叹号(!)表示,可以应用于任何ECMAScript中的任何值。无论这个值是什么类型的值,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换成一个布尔值,然后进行取反。如下所示:
 
alert(!fa lse);        // true
alert(!"blue");     // false
alert(!0);             // true
alert(!NaN);        // true
alert(!12345);     // false
 
提示:只需记住各个类型的值对应的布尔值,然后根据逻辑非操作符的规则进行转换即可。
 
同时运用两个逻辑非操作符,实际上就模拟Boolean()方法进行类型转换过程,第一个逻辑非操作符会基于无论什么操作数都会返回一个布尔值,第二个逻辑非则对该布尔值进行求反,于是就得到了这个值真正对应的布尔值。如下例子:
 
alert(!!false);        //false
alert(!!"blue");     //true
alert(!!0);             //fasle
alert(!!NaN);        //false
alert(!!12345);     //true
 
2.逻辑与
 
逻辑与操作符由两个和号(&&)表示,有两个操作数,如下面例子所示:
 
var  result = true && false;
 
逻辑与的真值表:
 
第一个操作数 第二个操作数 结果
true true true
true false false
false true false
false false false
 
逻辑与可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。此时它遵循以下规则:
 
如果第一个操作数是对象(非空对象),则返回第二个操作数;
 
如果第二个操作数是对象,则只有在第一个操作数求值结果为true的情况下,才会返回该对象;
 
如果两个操作数都是对象,则返回第二个操作数;
 
逻辑与属于短路操作:即如果第一个数能够决定结果,那么就不会对第二个操作数进行求值。对于逻辑与操作符而言,如果第一个操作数的求值结果是false,则无论第二个操作数是什么值,结果都不能为true。如下所示:
 
var num1 = 0;
var num2 = 12;
console.log(num1 && num2);   // 结果输出 0 ;
 
备注:不能在逻辑与操作符中使用未定义的值。
 
3.逻辑或
 
逻辑或操作符由两个竖线符(||)表示,有两个操作数,如下的例子所示:
 
var  result  ||  false;
 
逻辑或的真值表:
 
第一个操作数 第二个操作数 结果
true true true
true false true
false true false
false false false
 
逻辑或和逻辑与一样,如果有一个操作数不是布尔值,则不一定返回布尔值;此时遵循下列规则:
 
如果两个操作数都是对象(非空),则返回第一个操作数;
 
如果第一个操作数求值结果为false,则返回第二个操作数;
 
如果第一个操作数是对象(非空对象),则返回第一个操作数;
 
逻辑或操作符与逻辑与操作符一样都是短路操作,也就是说第一个操作符只要求值结果为true,就不会对第二个值进行求值了。
 
备注:可以利用逻辑或的这一行为来变量赋值null或undefined值。例如:
 
var  aObject = iObject ||  jObject;
 
这个例子中,变量 aObject将被赋予等于号后面两个值中的其中一个。变量iObject 中包含优先赋值给aObject的值,变量jObject负责在iObject中不包含有效值的情况提供后备值。如果iObject中的值不是null,那么它的值将赋给aOBject;如果是null,则将jObject的值赋值给aObject。
 
乘性操作符
 
主要有:乘法、除法、求模
 
 
1.乘法
 
乘法操作符由一个*号表示,用于计算两个值的乘积。
 
在处理特殊值的情况下,乘法操作符遵循下列特殊的规则
 
如果有一个操作数是NaN,则结果返回NaN;
 
如果是infinity与0相乘,则结果是NaN;
 
如果是infinity 与非0数值相乘,则结果是infinity或则是-infinity,取决于有符号操作数的符号;
 
如果infinity与infinity相乘,则结果是infinity;
 
如果一个操作数不是数值,则在后台调用number()将其转换为数值,然后在运用上面的符号;
 
 
2.除法
 
除法操作符由一个斜符号(/),执行第二个操作数除第一个操作数的计算,如下例子所示:
 
var  result  =  66   /   12;
 
与乘法操作符类似,除法操作符对特殊的值也有特殊的处理。这些规则如下:
 
如果有一个操作数是NaN,则结果返回NaN;
 
如果Infinity 被 Infinity除,则结果是NaN;
 
如果0被0除,则结果是NaN;
 
如果非零的有限数被零除,则结果是Infitity,符号取决于有符号操作数;
 
如果Infinity被非零数除,则结果是Infinity或-Infinity,符号取决去有符号操作数;
 
如果一个操作数不是数值,则在后台调用Number()将其转换为数值,然后运用上面的规则;
 
 
3.求模
 
求模操作符由一个百分号(%)表示,用法如下:
 
如果被除数是无穷大而除数是有限大的数值,则结果返回NaN;
 
如果被除数是无穷大而除数是零,则结果返回NaN;
 
如果是Infinity被Infinity除,则结果是NaN;
 
如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
 
如果被除数是0,则结果是0;
 
如果一个操作数不是数值,则在后台调用Number()将其转换为数值,然后运用上面的规则;
 
关系操作符
 
小于(<)、大于(>)、小于等于(<=)、大于等于(>=)这几个操作符都是用于两个值进行比较,都返回一个布尔值。如下所示:
 
var   result1  = 5 > 3;      // true 
 
var   result2  =  5 < 3;     // false
 
与ECMAScript中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换,完成某些奇怪的操作。以下是响应的规则:
 
如果两个数是正常的数值,则执行数值比较;
 
如果两个操作数都是字符串,则比较两个字符串对应的字符编码;
 
如果一个操作数是数值,则将另外一个操作数转换为一个数值,然后执行数值比较;
 
如果一个操作数是对象,则调用valueOf()方法,得到的结果按前面的规则执行比较。如果是对象没有valueOf()方法,则调用toString()方法,并得到结果根据前面的规则进行比较。
 
如果一个操作数是布尔值,则先将其转换为数值,然后执行比较;
 
备注:任何数值与NaN关系比较,结果都是false。
 
 
相等操作符
 
ECMAScript提供了两组操作符:相等和不相等----先转换在比较,全等和不全等----仅仅比较而不转换。
 
1.相等与不相等
 
在ECMAScript中相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true。而不相等时由一个感叹号和一个等于号(!=)表示,如果两个操作数不相等,则返回true这两个操作符都会先转换操作数(通常称为强制转型),然后比较它们的相等性。
 
规则如下:
 
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转换为0,而true转换为1;
 
如果一个操作数是字符串,而另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
 
如果一个操作数是对象,另外一个操作数不是,则调用对象的valueOf()方法,用的得到的基本类型值按照前面的规则进行比较。
 
两个操作符进行比较时,则遵循下列规则
 
只要类型转换后的值相等,就返回true
 
null和undefined是相等的;
 
在比较相等性之前,不能将null和undefined转换成其他任何值;
 
如果一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true;Tip:即使两个操作数都是NaN,相等操作符返回false;因为按照规则NaN不等于NaN;
 
如果两个操作数是都是对象,则比较它们是不是同一个对象。如果两个对象指向的是同一个对象,则相等操作符返回true。
 
全等与不全等
 
全等操作符在比较值前不进行类型转换,全等操作符用3个等于号(===)表示,它只有在两个操作数未经转换就相等就会返回true。如下所示:
 
var num1 = "55";   
 var num2 = 55;      //  false
 
console.log(num1 == num2);      //  true
console.log(num1 === num2);    // false
 
不全等操作符由一个感叹号和两个等于号(!==)表示,它在两个操作数未经转换就不相等的情况下才返回true。具体代码如下:
 
var num1 = "55";   
 var num2 = 55;      //  false
 
console.log(num1 == num2);      //  true
console.log(num1 === num2);    // true
 
备注:undefined === null 会返回false,因为两者类型不相等。
 
 
条件操作符
 
var  num  = num1_expression ? true_num2 : false_num3;
 
详解:本质上,运行这行代码就是基于对num1_expression的求值结果,求值结果决定了num的值。如果num1_expression求值为true,则num的值为true_num2,如果num1_expression求值为false,则num的值为false_num3。
 
 
 
posted @ 2017-03-25 16:26  北落师门丨  阅读(154)  评论(0编辑  收藏  举报