《JavaScript高级程序设计》读书笔记3.3操作符

操作符:用于操作数据值。包括算术操作符、伪操作符、关系操作符、相等操作符

1. 一元操作符

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

1.1 递增和递减操作符
  • 前置型,变量的值是在语句被求值以前改变的。即先计算自己的递增或递减运算。
  • 后置型,变量的值是在语句被求值以后改变的。即后计算自己的递增或递减运算。
    1
    2
    3
    4
    5
    var num1=2;
    var num2=20;
    var num3=--num1+num2; //等于21
    var num3=num-- +num2; //等于22
    <!--var num4=num1+num2; //等于21-->

适用于任何值,整数、字符串、布尔值、对象、浮点值。规则如下例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.1000000000009(浮点舍入错误)
o--; //值变成-2
1.2 一元加或减操作符

一元加操作符(+)对数值无任何影响;对非数值则会像Number()对这个值执行转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var s1="01";
var s2="1.1";
var s3="z";
var b=false;
var f=1.1;
var o={
valueOf:function(){
return -1;
}
};

s1=+s1; //值变成数值1;
s2=+s2; //值变成数值1.1;
s3=+s3; //值变成NaN;
b=+b; //值变成数值0;
f=+f; //值变成数值1.1;
o=+0; //值变成数值-1;

一元减操作符(-)用于数值时,该值会变成负数;应用于非数值时,和(+)规则相同,最后再将数值变成负数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var num=25;
var s1="01";
var s2="1.1";
var s3="z";
var b=false;
var f=1.1;
var o={
valueOf:function(){
return -1;
}
};

num=-num; //值变成数值-25;
s1=-s1; //值变成数值-1;
s2=-s2; //值变成数值-1.1;
s3=-s3; //值变成NaN;
b=-b; //值变成数值0;
f=-f; //值变成-1.1;
o=-o; //值变成数值1;

2. 位操作符

  • 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。
  • 正数以纯二进制格式存储。
  • 负数以二进制补码格式存储。3个步骤。
  • 非数值应用位操作符,会先使用Number()将该值转换成一个数值,再进行位操作。
  • 7个位操作符
    1. 按位非,~表示;
    2. 按位与,&表示;
    3. 按位或,|表示;
    4. 按位异或,^表示;
    5. 左移,<<表示;
    6. 有符号的右移,>>表示;
    7. 无符号的右移,>>>表示;

3. 布尔操作符

3个:非(NOT)、与(AND)、或(OR)

3.1 逻辑非(!)

先将其操作数转换为一个布尔值,再对其求反。

1
2
3
4
5
6
alert(!false);      //true
alert(!"blue"); //false
alert(!0); //true
alert(!NaN); //true
alert(!""); //true
alert(!12345); //false

同时使用两个逻辑非操作符(!!)会模拟Boolean()函数的行为。可理解为负负得正。

1
2
3
4
5
alert(!!"blue");   //true
alert(!!0); //false
alert(!!NaN); //false
alert(!!""); //false
alert(!!12345); //true
3.2 逻辑与(&&)

&&是一个短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。即第一个操作数是false,则不会对第二个操作数求值,结果就是false。
真值表如下:

第一个操作数 第二个操作数 结果
true true true
true false false
false true false
false false false

遵循的规则:短路操作。第一个操作数求值遇false就停止,求值遇true则继续对第二个操作数求值并返回第二个

  • 如果第一个操作数是对象,则返回第二个操作数
  • 如果第二个操作数的对象,则只有在第一个操作数的求值结果为true其情况下才返回该对象
  • 如果两个操作数都是对象,则返回第二个操作数
  • 如果第一个操作数是null,则返回null
  • 如果第一个操作数是NaN,则返回NaN
  • 如果第一个操作数是undefined,则返回undefined
3.3 逻辑或(||)

||是一个短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。即第一个操作数是true,则不会对第二个操作数求值,结果就是true。
||可以用来避免为变量赋null和undefined值。

遵循规则:短路操作。第一个操作数求值遇true则停止,遇false则继续对第二个操作数求值并返回第二个

  • 如果第一个操作数的是对象,则返回第一个操作数
  • 如果第一个操作数的求值是false,则返回第二个操作数
  • 如果两个操作数是对象,则返回第一个操作数
  • 如果两个操作数都是null,则返回null
  • 如果两个操作数都是NaN,则返回NaN
  • 如果两个操作数都是undefined,则返回undefined

4.乘性操作符

ECMAScript定义3个乘性操作符:乘法(*)、除法(/)、求模(%)。操作数为非数值时会用Number()函数转换。

5.加性操作符

加法(+)、减法(-),也会在后台转换数据类型,不过不是用Number(),转换规则更复杂。
加法的特殊规则是–>toString()转换再字符串拼接

1
2
3
4
5
6
var result1=5+5     //结果是10
var result2=5+"5" //结果是"55"
var num1=5;
var num2=10;
var message="The sum of 5 and 10 is"+num1+num2;
alert(message); //结果是"The sum of 5 and 10 is 510"

减法的特殊规则是–>Number()转换再数值相减

1
2
3
4
5
6
var result1=5-true;   //4
var result2=NaN-1; //NaN
var result3=5-3; //2
var result4=5-""; //5
var result5=5-"2"; //3
var result=5-"null"; //5

6.关系操作符

  • 奇怪的规则:
    • 两个操作数都是字符串,则比较其对应的字符编码
    • 有一个操作数是数值,则另一个也转换成数值
    • NaN与任何操作数比较都是false.
      1
      2
      3
      var result="23"<"3";     //true
      var result="23"<3; //false
      var result="a"<3; //false

7.相等操作符

  • 相等(==)和不相等(!=)–>先转换再比较

  • 全等(===)和不全等–>仅比较不转换

    • === 操作符是等于操作符,但是当其中有一个操作数为对象时,行为就不同了。

      1
      2
      3
      4
      5
      {} === {};                   // false
      new String('foo') === 'foo'; // false
      new Number(10) === 10; // false
      var foo = {};
      foo === foo; // true

      这里等于操作符比较的不是值是否相等,而是是否属于同一个身份;也就是说,只有对象的同一个实例才被认为是相等的。 这有点像 Python 中的 is 和 C 中的指针比较。

  • 推荐使用全等和不全等

8.条件操作符

1
2
variable=booolean_expression?true_value:false_value;
var max=(num1>num2)?num1:num2;
liborn wechat
欢迎您扫一扫上面的微信二维码,订阅我的公众号!