JavaScript高级程序设计 第4版 -- 操作符

3.5 操作符

3.5.1一元操作符

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

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

console.log(age);         // 28
console.log(anotherAge);  // 30

规则:
不限于整数
 对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
 对于字符串,如果不是有效的数值形式,则将变量的值设置为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
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
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
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
5、左移(<<)

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

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

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

6、有符号右移(>>)

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

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

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

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

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

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

console.log(!!"blue"); // true
console.log(!!0);      // false
console.log(!!NaN);    // false
console.log(!!"");     // false
console.log(!!12345);  // true
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

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

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

let sqrt = 16;
sqrt **= 0.5;
console.log(sqrt); // 4

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

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是表达式中最后一项。逗号操作符的这种使用场景并不多见,但这种行为的确存在。

### 回答1: 《JavaScript高级程序设计》第4是一本深入讲解JavaScript编程语言的书籍。该书详细介绍了JavaScript的基础知识、语法、面向对象编程、DOM操作、事件处理、Ajax、JSON等方面的内容。此外,该书还介绍了一些高级技术,如模块化编程、正则表达式、Web Workers、Web Storage等。该书适合有一定JavaScript基础的读者阅读,可以帮助读者深入了解JavaScript编程语言,提高编程技能。 ### 回答2: 《JavaScript高级程序设计》第4(以下简称《JS高级程序设计》)是由李炎恢编写的一部JavaScript语言的经典教材,它被誉为“JavaScript圣经”。本书全面深入地讲解了JavaScript语言的核心概念、高级特性和最佳实践,对于想要深入学习JavaScript的开发者来说是一本必读之作。 首先,本书从JavaScript的基础知识开始,包括JavaScript的数据类型、变量、运算符、函数等。随后,本书详细介绍了JavaScript的面向对象编程,包括对象、原型、继承等概念,以及使用构造函数和类来创建对象的方法。 其次,本书不仅讲述了JavaScript的基本语法,更详细深入地介绍了诸如函数表达式、闭包、高阶函数、递归等高级特性,对于想要提高自己的JavaScript编程能力的开发者很有帮助。 最后,本书也介绍了一些实际的开发技巧和最佳实践,例如DOM操作、事件处理、Ajax、JSON、模块化开发等,让开发者在实际的开发中更加得心应手。 总之,《JavaScript高级程序设计》第4是一本权威性的JavaScript经典教材,它涵盖了JavaScript的核心概念、高级特性和最佳实践,对于想要深入了解JavaScript的开发者来说是一本必读之作。无论是初学者还是有经验的开发者,都可以从中找到大量有用的知识和实践经验。 ### 回答3: 《JavaScript高级程序设计》第4是由三著名的前端开发专家编写的JavaScript权威教程。本书介绍了JavaScript的核心概念、语言特性和应用方法,以及一些高级技巧和最佳实践。 本书的第一部分从JavaScript基础语法开始介绍,包括变量声明、数据类型、操作符、语句和函数等方面。第二部分主要介绍JavaScript的面向对象编程,包括原型链、继承和封装等概念。第三部分主要介绍JavaScript的一些高级特性,包括闭包、异步编程、事件和延迟加载等内容。第四部分主要介绍了如何使用JavaScript实现一些实际应用,包括调试、性能优化、动态Web页面和跨域请求等方面。 本书内容全面、深入,不仅介绍了JavaScript的基础知识,更重要的是让读者理解了JavaScript的思想和编程风格。编写本书的三专家都是行业内的大牛,他们的经验和见解非常宝贵,能够帮助读者更好地理解JavaScript。同时,本书的配套网站还提供了很多实例代码和练习题,读者可以通过这些实践来深入理解JavaScript。 总之,《JavaScript高级程序设计》第4是一本非常不错的JavaScript权威教程,无论是初学者还是专业开发者都可以从中受益匪浅。如果你想深入学习JavaScript,这本书绝对值得一读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值