JS高程3.基本概念(4)操作符

  ECMA-262用来操作数据值的操作符包括:

  算术操作符

  位操作符

  关系操作符

  相等操作符

  ECMAScript操作符的不同之处在于:它可以适用于广大值,包括字符串,数字值,布尔值,甚至是目标。(在使用于对象时,相应的操作符平时会调用对象的valueOf()和(或)toString()方法,以便赢得足以操作的值。)

 

1.一元操作符

(1)递增和递减操作符

  需要注意的是:

  eg:

    前置++age:变量的值在说话被求值从前改变。

    后置age++:变量的值在言辞被求值之后更改。

  执行放到递增和递减操作时,变量的值都是在言辞被求值从前改变的(在微机科学领域中,那种状态熟视无睹被称作复效应。)

 

  递增和递减操作符应用于其他数据类型遵守的规则详见高程书P37。

(2)一元加和减操作符

  当一元加和减操作符放在数值后面时,相当于正负号。

  当一元加和减操作符放在非数值类型的数据类型前时,它会按照相应的平整举办数据类型的变换。

 

2.位操作符

  ECMAScript中持有的数值都是以IEEE-754
64位格式存储的,不过为操作符并不是一贯操作64位的值。而是先将64位的值转换成32位的整数,然后实施操作,最终在将结果转换回64位。不过那个转换过程也致使了一个严重的复效应,即在对极度的NaN和Infinity值应用位操作时,这五个值都会被当成0来处理。

  要是对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),再开展位操作,最后得到一个数值。

 

(1)负数以二进制补码的格式存储。

测算一个数值二进制补码的进程如下:

1.求这一个数值相对值的二进制码。

2.求二进制的反码。

3.拿走的二进制反码加1。

 

(2)ECMAScript中,当我们以二进制字符串形式出口一个负数时,我们见到的这些负数的相对值的二进制码前边加了一个负号,它以更合乎逻辑的花样显得了出来。

eg:

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

图片 1

 

  注:

  默认情形下,ECMAScript中的所有整数都是有号子整数。当然,也存在无符号整数,无符号整数的值更大,因为第32位不再代表符号,可以用来表示数值。

 

(3)按位非(NOT):符号~

  按位非的本色是操作数的负值减1。

(4)按位与(AND):符号&

(5)按位或(OR):符号|

(6)按位异或(XOR):符号^

(7)左移:符号<<,左移操作现身的空位以0填充。左移不会影响数值的记号位。

(8)有标志的右移:符号>>,右移时保留符号位,右移出现的空位由符号位填充。

(9)无符号的右移:符号>>>,无符号的右移发生的空位以0填充。所以,正数的无符号右移和有标志右移结果同样,负数就不同等了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码,而且,由于负数以其相对值的二进制的补码表示,因而就会导致无符号右移后的结果相当之大。

 

3.布尔操作符

   布尔操作符有两个:非(NOT:!),与(AND:&&),或(OR:||)

(1)逻辑非:运用该操作符时,首先会对它的操作数转换成一个布尔值,然后对其求反。详细规则见高程P44。

  注:同时拔取六个逻辑非操作符,能够拿走这多少个值真正对应的布尔值,与利用Boolean()函数的结果一致。

  eg:alert(!!123);//true

    alert(!!NaN);//false

 

(2)逻辑与:该操作可以行使于其余类型的操作数,在有一个操作数不是布尔值的时候,逻辑与操作就不必然重临布尔值。详细规则见高程P45。

  注:逻辑与操作属于短路操作,即如若第一个操作数可以决定结果,那么就不会再对第二个操作数求值。

eg:

 

1 var found=true;
2     var result=(found && someUndefinedVariable);  //这里发生错误
3     alert(result);          //这一行不会执行

 

图片 2

  下边代码出现谬误的因由是,因为found的值是true,所有逻辑与会继续对第二个变量求值,可是出于第二个变量没有定义,所以造成错误。表达不可能再逻辑与中使用未定义的值。

  将found的值改为false,由于逻辑与的阻隔特性,就不相会世谬误。如下所示:

1 var found=false;
2     var result=(found && someUndefinedVariable);//不会发生错误
3     alert(result);//会执行

图片 3

 

 

 

(3)逻辑或:与逻辑与一般,也是短路操作符,详细的条条框框见高程P46。

  注:

  可以运用逻辑或的俩避免为变量赋null或undefined值。

  eg: var
myobject = preferredObject || backupObject;

  ECMAScript程序的赋值语句日常会采取到这种模式,如若preferredObject不是null,那么它的值将会赋给myobject,假使是null,则将backupObject的值赋给myobject。

 

4.乘性操作符:乘法(*),除法(/),求模(%)

  当操作数是非数值的时候,后台会先采纳Number()转型函数将其转移为数值。

(1)乘法。详细的规则见高程P47。

(2)除法。详细的规则见高程P47。

(3)求模。详细的条条框框见高程P48。

 

5.加性操作符:加法(+),减法(-)。

(1)加法

  有以下两种情状:

一.
当六个操作数都是数值时,执行正常的加法运算,详细的规则见高程P48。

二.
假使多少个操作数存在字符串,当多个操作数都是字符串时,直接将两个字符串拼接起来,即使唯有一个操作数是字符串,则将另一个操作数转换为字符串,然后在将五个字符串拼接起来。

 

注意:

  如若有一个操作数是目的,数值或是布尔值,则调用toString()方法赢得相应的字符串值,然后在运用前边的有关字符串的规则。对于undefined和null,则调用String()函数并收获字符串“undefined”和“null”。

 

一个因为忽视加法操作符数据类型而招致的广大的不当:

eg:

 

1  var num1=2;
2     var num2=8;
3     var text="The sum of 2 and 8 is:"+ num1 +num2;
4     alert(text);

 

 

结果如下:

图片 4

 

  

 要赢得不错的结果,可以像下边这样使用圆括号:

1 var num1=2;
2     var num2=8;
3     var text="The sum of 2 and 8 is:"+ (num1 +num2);
4     alert(text);

结果如下:

 

图片 5

 

(2)减法。详细的规则见高程P49。

 

6.涉嫌操作符: < , > ,
<= , >= ,这多少个操作都回去布尔值。详细的条条框框见高程P50。

 需要留意的是:当几个操作数都是字符串是,则相比较三个字符串对应的字符编码值。

eg:

  

1 var result="23"<"3";
2     alert(result);

 

结果:

图片 6

出现这么结果的原故是:五个操作数都是字符串,,所以相比较的是字符编码,(“2”的字符编码是50,而“3”的字符编码是51。)

 

能够将其中一个操作数改为数值,这样的可比时,后台会自动将另一个操作数也转移为数值类型,这样就足以拿走正确的结果,如下所示:

  

1  var result="23"<3;
2     alert(result);

图片 7

 

7.等于操作符

  (1)相等和不对等(== or 
!=):先转移再相比较。(强制转型)详细的条条框框见高程P51。

    注:

    null和undefined是非常的,且在相比相等性在此之前无法将null和undefined转换为任何任何值。

    假使六个操作数书对象,则相比较它们是否是同一对象。

 

  (2)全等和不全等(=== or
!===):仅相比而不转换。详细的条条框框见高程P52。

    eg:

1  var result1=("55"==55);
2     var result2=("55"===55);
3     alert(result1);
4     alert(result2);

结果依次如下:

图片 8

图片 9

1  var result1=(null==undefined);
2     var result2=(null===undefined);
3     alert(result1);
4     alert(result2);

结果依次如下:

图片 10

图片 11

 

8.条件操作符

eg:

1 var max=(5>10)?5:10;
2     alert(max);

图片 12

 

9.赋值操作符(=):把右手的值赋给右侧的变量。复合赋值操作符详见高程P53。

  注:复合赋值操作符可以简化赋值操作,不过它们不会带来另外性质上的升官。

 

10.逗号操作符

  (1)讲明两个变量

  eg:var num1=1,num2=4,num3=9;

  (2)赋值,逗号操作符总是会回到表明中的最终一项。

  eg:var num=(4,5,6,0);

    alert(num);

结果:图片 13