当前位置:   article > 正文

JavaScript高级程序设计 第4版 -- 操作符_js 位操作符 javascript高级程序设计(第4版)

js 位操作符 javascript高级程序设计(第4版)

3.5 操作符

3.5.1一元操作符

前缀版:
变量的值会在语句被求值前改变
后缀版:
递增递减在语句被求值后才改变

let age = 29;
let anotherAge = --age + 2;

console.log(age);         // 28
console.log(anotherAge);  // 30
  • 1
  • 2
  • 3
  • 4
  • 5

规则:
不限于整数
 对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
 对于字符串,如果不是有效的数值形式,则将变量的值设置为NaN 。变量类型从字符串变成
数值。
 对于布尔值,如果是false,则转换为0 再应用改变。变量类型从布尔值变成数值。
 对于布尔值,如果是true,则转换为1 再应用改变。变量类型从布尔值变成数值。
 对于浮点值,加1 或减1。
 如果是对象,则调用其(第5 章会详细介绍的)valueOf()方法取得可以操作的值。对得到的
值应用上述规则。如果是NaN,则调用toString()并再次应用其他规则。变量类型从对象变成
数值。

3.5.2 位操作符

1、按位非
let num1 = 25;      // 二进制00000000000000000000000000011001
let num2 = ~num1;   // 二进制11111111111111111111111111100110
console.log(num2);  // -26
  • 1
  • 2
  • 3
2、按位与

按位与操作在两个位都是1时返回1,在任何一位是0时返回0。
在这里插入图片描述

let 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3、按位或

按位或操作在至少一位是1时返回1,两位都是0时返回0。
在这里插入图片描述

let 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
---------------------------------------------
 OR = 0000 0000 0000 0000 0000 0000 0001 1011
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
4、按位异或

按位异或与按位或的区别是,它只在一位上是1的时候返回1(两位都是1或0,则返回0)
在这里插入图片描述

let 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
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
5、左移(<<)

按照指定的位数将数值的所有位向左移动

let oldValue = 2;              // 等于二进制10
let newValue = oldValue << 5;  // 等于二进制1000000, 即十进制64
  • 1
  • 2

左移会保留它所操作数值的符号。比如,如果-2左移5位,将得到-64,而不是正64。

6、有符号右移(>>)

将数值的所有32位都向右移,同时保留符号(正或负)。有符号右移实际上是左移的逆运算。

let oldValue = 64;             // 等于二进制1000000
let newValue = oldValue >> 5;  // 等于二进制10, 即十进制2
  • 1
  • 2
7、无符号右移(>>>)

对正数来说,这跟有符号右移效果相同。但对负数来说,结果就差太多了。无符号右移操作符将负数的二进制表示当成正数的二进制表示来处理。因为负数是其绝对值的二补数,所以右移之后结果变得非常之大,

let oldValue = -64;              // 等于二进制11111111111111111111111111000000
let newValue = oldValue >>> 5;   // 等于十进制134217726
  • 1
  • 2

3.5.3 布尔操作符

1.逻辑非(!)

规则:

  • 如果操作数是对象,则返回false。
  • 如果操作数是空字符串,则返回true。
  • 如果操作数是非空字符串,则返回false。
  • 如果操作数是数值0,则返回true。
  • 如果操作数是非0数值(包括Infinity),则返回false。
  • 如果操作数是null,则返回true。
  • 如果操作数是NaN,则返回true。
  • 如果操作数是undefined,则返回true。
console.log(!false);   // true
console.log(!"blue");  // false
console.log(!0);       // true
console.log(!NaN);     // true
console.log(!"");      // true
console.log(!12345);   // false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

逻辑非操作符也可以用于把任意值转换为布尔值。同时使用两个叹号(!!),相当于调用了转型函数Boolean()。无论操作数是什么类型,第一个叹号总会返回布尔值。第二个叹号对该布尔值取反,从而给出变量真正对应的布尔值。结果与对同一个值使用Boolean()函数是一样的

console.log(!!"blue"); // true
console.log(!!0);      // false
console.log(!!NaN);    // false
console.log(!!"");     // false
console.log(!!12345);  // true
  • 1
  • 2
  • 3
  • 4
  • 5
2.逻辑与(&&)

规则:

  • 如果第一个操作数是对象,则返回第二个操作数。
  • 如果第二个操作数是对象,则只有第一个操作数求值为true才会返回该对象。
  • 如果两个操作数都是对象,则返回第二个操作数。
  • 如果有一个操作数是null,则返回null。
  • 如果有一个操作数是NaN,则返回NaN。
  • 如果有一个操作数是undefined,则返回undefined。

逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。对逻辑与操作符来说,如果第一个操作数是false,那么无论第二个操作数是什么值,结果也不可能等于true。

3.逻辑或(||)

规则:

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

逻辑或操作符也具有短路的特性。只不过对逻辑或而言,第一个操作数求值为true,第二个操作数就不会再被求值了。

3.5.4 乘性操作符

1.乘法操作符(*)

特殊的行为:

  • 如果操作数都是数值,则执行常规的乘法运算,即两个正值相乘是正值,两个负值相乘也是正值,正负符号不同的值相乘得到负值。如果ECMAScript不能表示乘积,则返回Infinity或-Infinity。
  • 如果有任一操作数是NaN,则返回NaN。
  • 如果是Infinity乘以0,则返回NaN。
  • 如果是Infinity乘以非0的有限数值,则根据第二个操作数的符号返回Infinity或-Infinity。
  • 如果是Infinity乘以Infinity,则返回Infinity。
  • 如果有不是数值的操作数,则先在后台用Number()将其转换为数值,然后再应用上述规则。
2.除法操作符(/)

特殊的行为。

  • 如果操作数都是数值,则执行常规的除法运算,即两个正值相除是正值,两个负值相除也是正值,符号不同的值相除得到负值。如果ECMAScript不能表示商,则返回Infinity或-Infinity。
  • 如果有任一操作数是NaN,则返回NaN。 •如果是Infinity除以Infinity,则返回NaN。 •如果是0除以0,则返回NaN。
  • 如果是非0的有限值除以0,则根据第一个操作数的符号返回Infinity或-Infinity。
  • 如果是Infinity除以任何数值,则根据第二个操作数的符号返回Infinity或-Infinity。
  • 如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。
3.取模操作符

特殊的行为。
•如果操作数是数值,则执行常规除法运算,返回余数。
•如果被除数是无限值,除数是有限值,则返回NaN。
•如果被除数是有限值,除数是0,则返回NaN。
•如果是Infinity除以Infinity,则返回NaN。
•如果被除数是有限值,除数是无限值,则返回被除数。
•如果被除数是0,除数不是0,则返回0。
•如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。

3.5.5 指数操作符

ECMAScript 7新增了指数操作符,Math.pow()现在有了自己的操作符**,结果是一样的:

console.log(Math.pow(3, 2);    // 9
console.log(3 ** 2);           // 9

console.log(Math.pow(16, 0.5); // 4
console.log(16** 0.5);         // 4
  • 1
  • 2
  • 3
  • 4
  • 5

不仅如此,指数操作符也有自己的指数赋值操作符**=,该操作符执行指数运算和结果的赋值操作

let squared = 3;
squared **= 2;
console.log(squared); // 9

let sqrt = 16;
sqrt **= 0.5;
console.log(sqrt); // 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.5.6 加性操作符

1.加法操作符(+)

返回结果:
•如果有任一操作数是NaN,则返回NaN;
•如果是Infinity加Infinity,则返回Infinity;
•如果是-Infinity加-Infinity,则返回-Infinity;
•如果是Infinity加-Infinity,则返回NaN;
•如果是+0加+0,则返回+0;
•如果是-0加+0,则返回+0;
•如果是-0加-0,则返回-0。
不过,如果有一个操作数是字符串,则要应用如下规则:
•如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
•如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
如果有任一操作数是对象、数值或布尔值,则调用它们的toString()方法以获取字符串,然后再应用前面的关于字符串的规则。对于undefined和null,则调用String()函数,分别获取"undefined"和"null"。

2.减法操作符(-)

返回规则:
•如果两个操作数都是数值,则执行数学减法运算并返回结果。
•如果有任一操作数是NaN,则返回NaN。
•如果是Infinity减Infinity,则返回NaN。
•如果是-Infinity减-Infinity,则返回NaN。
•如果是Infinity减-Infinity,则返回Infinity。
•如果是-Infinity减Infinity,则返回-Infinity。
•如果是+0减+0,则返回+0。
•如果是+0减-0,则返回-0。
•如果是-0减-0,则返回+0。
•如果有任一操作数是字符串、布尔值、null或undefined,则先在后台使用Number()将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是NaN,则减法计算的结果是NaN。
•如果有任一操作数是对象,则调用其valueOf()方法取得表示它的数值。如果该值是NaN,则减法计算的结果是NaN。如果对象没有valueOf()方法,则调用其toString()方法,然后再将得到的字符串转换为数值。

let result1 = 5 - true; // true被转换为1, 所以结果是4
let result2 = NaN - 1;  // NaN
let result3 = 5 - 3;    // 2
let result4 = 5 - "";   // ""被转换为0, 所以结果是5
let result5 = 5 - "2";  // "2"被转换为2, 所以结果是3
let result6 = 5 - null; // null被转换为0, 所以结果是5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.5.7 关系操作符(>,>=,<,<=)

规则:
•如果操作数都是数值,则执行数值比较。
•如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
•如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
•如果有任一操作数是对象,则调用其valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有valueOf()操作符,则调用toString()方法,取得结果后再根据前面的规则执行比较。
•如果有任一操作数是布尔值,则将其转换为数值再执行比较。

1.等于和不等于

在这里插入图片描述

2.全等和不全等

会比较数据类型

3.5.9 条件操作符(三目)

let max = (num1 > num2) ? num1 : num2;

3.5.10 赋值操作符

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

3.5.11 逗号操作符

逗号操作符可以用来在一条语句中执行多个操作,如下所示:

let num1 = 1, num2 = 2, num3 = 3;

在一条语句中同时声明多个变量是逗号操作符最常用的场景。不过,也可以使用逗号操作符来辅助赋值。在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值:

let num = (5, 1, 4, 8, 0); // num的值为0

在这个例子中,num将被赋值为0,因为0是表达式中最后一项。逗号操作符的这种使用场景并不多见,但这种行为的确存在。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/871283
推荐阅读
相关标签
  

闽ICP备14008679号