您的位置:首页 > Web前端 > JavaScript

JavaScript基本概念(三)

2016-12-04 19:47 253 查看
操作符

操作符包括算术操作符、位操作符、关系操作符和相等操作符。ECMAScript操作符与众不同的是,它们适用于很多值,不过在应用于对象时,相应的操作符通常会调用对象的valueOf()或者是toString()方法,以便取得操作的值。

1.一元操作符

只能操作一个值的运算符叫做一元运算符。

(1) 递增和递减运算符

递增运算符和递减运算符分为前置型和后置型。执行前置递增和递减操作时,变量的值是在语句被求值之前改变的;执行后置递增和递减操作时,变量的值是在语句被求值之后改变的。这四个运算符不仅能应用于整数类型,还能应用于字符串、布尔值、浮点数和对象。在应用于不同对象的时候,需要遵循如下的规则:

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 s3=false;
var s4=true;
var s5=1.1;
var o={
valueOf:function()
{
return -1;
}
};
alert(++s1); //3
alert(++s2); //NaN
alert(++s3); //1
alert(++s4); //2
alert(s5); //2.1
alert(--o); //-2


2.一元加减操作符

一元加减操作符以一个加号表示。放在数值前面,对数值不会产生任何影响;应用于非数值时,该操作符会像Number()转型函数一样对这个值进行转换。一元减操作符主要用于表示负数。例如:

var s1="01";
var s2="1.1";
var s3="z";
var s4=false;
var s5=1.1;
var o={
valueOf:function(){
return -1;
}
};
s1=+s1; //1
s2=+s2;  //1.1
s3=+s3;  //NaN
s4=+s4; //0
s5=+s5; //1.1
o=-o;  //-1

s1=-s1; //-1
s2=-s2;  //-1.1
s3=-s3;  //NaN
s4=-s4; //0
s5=-s5; //-1.1
o=-o;  //1


从上面的学习可以看出,一元加减操作符不仅可以用于基本的算术运算,也可以用于转换数据类型。

2.位操作符

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。正数和负数都是二进制存储,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过3个步骤:

1) 求这个数值绝对值的二进制码。

2) 求二进制反码。

3) 得到的二进制反码加1。

ECMAScript会尽力隐藏所有这些信息,在以二进制字符串形式输出一个负数时,我们看到的只是在这个服输绝对值的二进制码前面加上一个负号,例如:

var num=-18;
alert(num.toString(2)); //-10010


如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。

按位非

按位非操作符由一个波浪线表示,执行按位非的结果就是返回数值的反码。例如:

var num1=25;
var num2=~num1;
alert(num2); //-26


按位与

按位与操作就是将两个数值的每一位对齐,然后根据规则执行AND操作,只有同为1时为1,其余情况都为0。下面是25和3执行按位与操作的例子:

var result=25&3;
alert(result); //1


按位或

按位或操作符由一个竖线符号(|)表示,先将两个数组的每一位对齐,然后根据规则进行操作。两个数只要不同时为0就为1。里面看一个例子:

var num1=25|3;
alert(num1); //27


按位异或

按位异或操作符有有两个操作数,首先也是将两个数值对齐,然后根据规则进行操作。当两个操作数对应为上的数值不一致时返回1,其余情况返回0。

var result=25^3;
alert(result); //26


左移

左移操作符用两个小于表示,这个操作符会将数值的所有位向左移动规定的位数,移动之后右侧用0补充。需要注意的是,左移不会影响操作数的符号位,例如将-2向左移动5位,结果为-64,而不是64。

有符号的右移

有符号的右移操作符用两个大于表示,会将数值向右移动指定的位数,用符号位的值去填充空位,符号不变,例如-64向右移动5位变成-2。

无符号右移

无符号右移运算符由3个大于号表示,这个操作符会将数值的所有32位都向右移动。对于正数来说,无符号右移的结果和有符号的右移动结果一样。例如将64无符号右移动5位,结果仍然是2。

var oldValue=64;
var newValue=oldValue>>>5; //2


如果是负数,就不一样了。无符号右移是以0填充空位,并且会把负数的二进制当成正数的二进制码,因为负数以绝对值的二进制码的补码表示,因此无符号右移将导致结果很大。例如:

var oldValue=-64;
alert(oldValue>>>5); //134217726


3.布尔操作符

布尔操作符有3个:非、与、或。

逻辑非

逻辑非操作符由叹号(!)表示。它可以应用于ECMAScript中的各种数据,返回的是一个布尔值。该操作符首先将操作数转换为一个布尔值,然后对齐求反。遵循如下规则:

1) 如果操作数是一个对象,那么返回false

2) 如果操作数是一个空字符串,那么 返回true

3) 如果操作数是一个非空字符串,那么返回false

4) 如果操作数是0,返回true

5) 如果操作数是不为0的数字,返回false

6) 如果操作数是null,返回true

7)如果操作数是NaN,返回true

8) 如果操作数是Undefined,返回true

例子如下:

alert(!false); //true
alert(!""); //true
alert(!"hello"); //false
alert(!0); //true
alert(!10); //false
alert(!null);  //true
alert(!undefined); //true
alert(!NaN); //true


逻辑非可以将一个值转换为其对应的布尔值,我们可以使用两次逻辑非操作符,效果和Boolean()方法一样。例如:

alert(!!""); //false
alert(!!"12345"); //true
alert(!!NaN); //false
alert(!!null); //false
alert(!!12345); //true


逻辑与

逻辑与操作符由两个和号(&&)组成,有两个操作数。当两个布尔值都为true时,返回true,其他情况都返回false。逻辑与不仅仅能操作布尔值,它还能操作其他类型的值。需要注意的是,在有一个操作数不是布尔值的情况下,就不一定返回布尔值,此时,它应当遵循如下规则:

1) 如果第一个操作数是对象,则返回第二个操作数。

2) 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时,才返回该对象。

3) 如果两个操作数都是对象,则返回第二个操作数。

4) 如果有一个操作数为null,则返回null。

5) 如果有一个操作数为NaN,则返回NaN。

6) 如果有一个操作数为undefined,则返回undefined。

需要注意的是,逻辑与是 一个短路操作。如果左边的操作数能够决定结果就将不会执行右边的操作数。

逻辑或

如果有一个操作数不是布尔值,那么就不一定返回布尔值,它遵循如下规则:

1) 如果第一个操作数是对象,则返回第一个操作数。

2) 如果第一个操作数的求值结果为false,则返回第二个操作数。

3) 如果两个操作数都是对象,那么返回第一个操作数。

4) 如果两个数都是null,则返回null。

5) 如果两个数都是NaN,则返回NaN。

6) 如果两个操作数都是undefined,则返回undefined。

逻辑或操作符也是短路操作符。只要第一个操作数求值的结果为true,那么将不再对第二个操作数求值。

4.乘性运算符

ECMAScript定义了3个乘性操作符:乘法、除法和取模。

乘法

用于计算两个数值的乘积。在处理特殊值的情况时,乘性操作符遵循下列特殊的规则:

1)两个都是数值,如果两个数值的乘积超过了ECMAScript数值的范围,则返回Infinity或者-Infinity。

2) 如果有一个操作数是NaN,则结果是NaN。

3) 如果是Infinity与0相乘,则结果是NaN。

4) 如果Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号数的符号。

5) 如果是Infinity和Infinity相乘,则结果是Infinity。

6) 如果一个操作数不是数值,则在后台调用Number()将其转换为数值,然后按照上面的几点规则进行计算。

除法

执行第二个数除第一个操作数的计算。除法操作符对特殊的值也有特殊的处理规则:

1) 如果操作数都是数值,执行常规的除法。如果商超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity。

2) 如果有一个操作数为NaN,那么结果为 NaN。

3) 如果是Infinity被Infinity除,那么结果为NaN。

4) 如果是零被零除,结果为NaN。

5) 如果非零的有限数被零除,则结果是Infinity或-Infinity,取决于有符号数的符号。

6) 如果是Infinity被非零数值除,则结果为Infinity或者-Infinity,取决于有符号数的符号。

7) 如果有一个操作数不是数值,那么首先调用Number()将其转换为数值,然后应用上面的规则。

求模

求摸操作符在处理特殊数值的时候,遵循如下规则:

1) 如果操作数都是不为0的数值,执行常规的操作,得到结果。

2) 如果被除数是无穷大值,执行常规的除法计算,返回除得的余数。

3) 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数。

4) 如果是Infinity除以Infinity,则结果是NaN。

5) 如果被除数是有限大的数值而除数是零,则结果为NaN。

6) 如果被除数是零,则结果是零。

7) 如果两个操作数都不是数值,那么首先调用Number()方法将其转换,之后根据上面的规则进行运算。

5.加性操作符

加性操作符包括加法操作符和减法操作符。在ECMAScript中,它们都会有一些特殊的行为。

加法

如果操作符两侧都是数值,那么执行正常的加法运算,其余的按如下规则进行操作:

1) 如果有一个操作数是NaN,则结果为NaN。

2) 如果是Infinity加Infinity,则结果为Infinity。

3) 如果是-Infinity加Infinity,则结果为-Infinity。

4) 如果是Infinity加-Infinity,则结果为NaN。

5) 如果是+0加+0,则结果为+0。

6) 如果是-0加-0,则结果为-0。

7) 如果是+0加-0,则结果为+0。

减法

减法在处理特殊数值的时候,应该遵循如下规则进行处理:

1) 如果两个操作数都是数值,执行常规的算术减法操作并返回结果。

2) 如果有一个操作数为Na,则结果为NaN。

3) 如果是Infinity减Infinity,则结果为NaN。

4) 如果是-Infinity减Infinity,则结果为NaN。

5) 如果是-Infinity减Infinity,则结果为-Infinity。

6) 如果是Infinity减-Infinity,则结果为Infinity。

7) 如果是+0减+0,则结果为-0。

8) 如果是+0减-0,则结果为-0。

9) 如果是-0减-0,则结果为+0。

10) 如果有一个操作数是字符串、布尔值、null或者undefined,则在后台先调用Number()函数将其转换为数值,然后根据规则进行运算,如果转换的结果为NaN,则减法的结果就为NaN。

11) 如果有一个操作数是对象,则调用valueOf()方法获得对象的数值,如果得到的是NaN,则减法的结果为NaN。如果对象没有valueOf()这个方法,那么就调用其toString()方法,并将其得到的字符串转换成数值。

6.关系操作符

用于两个值比较,返回的结果是一个布尔值。在操作数是非数值的时候,需要根据如下规则进行操作:

1) 如果两个数都是数值,则正常比较。

2) 如果两个都是字符串,则按照字符串对应的字符编码进行比较。

3) 如果一个操作数是数值,则将另一个不是数值的操作数先转换成数值,然后进行比较。

4)如果一个操作数是对象,则先调用valueOf()方法,得到的结果按照前面的规则进行比较,如果没有此方法,则调用toString()方法,并格局前面的规则进行比较。

5) 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

注意,无论那个数与NaN进行比较,返回的都是false。

相等操作符

为了解决对象的比较问题,ECMAScript提供了两组操作符:相等和不相等–先转换再比较,全等和不全等–仅比较而不转换。

(1) 相等和不相等

在转换不同类型的数据时,相等和不相等操作符,遵循如下规则:

1) 如果一个操作数是布尔值,则在比较之前,false转换成0,true转换成1。

2) 如果一个操作数是数值,另一个是字符串,则需要将字符串先转换成数值。

3) 如果一个操作数是对象,另一个不是,则先调用对象的valueOf()方法,将其转换成基本类型的数据,,然后进行比较。

这两个操作符进行比较的时候,需要遵循如下规则:

1) null和undefined是相等的。

2) 要比较相等性之前,不能将null或者undefined转换成其他任何值。

3) 如果有一个操作数是NaN,则相对操作符返回false,不相等操作符返回true。需要注意的是,NaN不等于NaN。

4)如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数指向的是同一个对象,则相对操作符返回true,否则返回false。

(2) 全等和不全等

全等操作符只在两个操作数未经过转换就相等的情况下返回true,不全等操作符只在两个操作数未经过转换就不相等的情况下返回true。

8.条件操作符

和Java中的条件操作符一样。

9.赋值操作符

包括:=、+=、-=、/=、*=、%=、<<=、>>=、>>>=。复合的操作符只是为了简化赋值操作,并不会带来性能上的提升。

10.逗号操作符

逗号操作符可以在一条语句中执行多个操作,比如同时声明多个变量;它还能用于赋值,在用于赋值时,逗号操作符总会返回表达式中的最后一项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript