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); // 125 = 0000 0000 0000 0000 0000 0000 0001 10013 = 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); // 2725 = 0000 0000 0000 0000 0000 0000 0001 10013 = 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); // 2625 = 0000 0000 0000 0000 0000 0000 0001 10013 = 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);           // 9console.log(Math.pow(16, 0.5); // 4
console.log(16** 0.5);         // 4

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

let squared = 3;
squared **= 2;
console.log(squared); // 9let 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是表达式中最后一项。逗号操作符的这种使用场景并不多见,但这种行为的确存在。

JavaScript高级程序设计 第4版 -- 操作符相关推荐

  1. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  2. JavaScript高级程序设计[第3版]

    JavaScript高级程序设计[第3版] package xyz.huning.toolkit.pdf;import java.io.FileOutputStream; import java.io ...

  3. JavaScript高级程序设计第四版学习--第二十四章

    title: JavaScript高级程序设计第四版学习–第二十四章 date: 2021-5-31 10:46:01 author: Xilong88 tags: JavaScript 本章内容: ...

  4. JavaScript高级程序设计 第4版----String

    JavaScript高级程序设计 第4版----String 文章目录 JavaScript高级程序设计 第4版----String 1.JavaScript 字符 2.字符串操作方法 1.conca ...

  5. javascript高级程序设计 第三版

    网盘地址 提取码:vh81 笔记 第二章 2.1script标签 <script>元素属性:async.charset.defer.language.src.type async和defe ...

  6. 新书-JavaScript高级程序设计:第2版(预订中,估价)

    http://www.china-pub.com/196857 JavaScript的应用在广度和深度上日益扩大和加深,前端开发亟待掌握的JavaScript技能也越来越具有挑战性. 这个新版本几乎全 ...

  7. JavaScript高级程序设计第三版 第3章 基本概念

    第3章 基本概念 3.1 语法 3.1.1 区分大小写 3.1.2 标识符 3.1.3 注释 3.1.4 严格模式 3.1.5 语句 3.2 关键字和保留字 3.3 变量 3.4 数据类型 3.4.1 ...

  8. javascript 高级程序设计(第4版)阅读笔记(三)

    第3章,内容很长,所以更得慢,主要讲的是ECMAScript   es的语言基础:语法.数据类型.基本操作符.流控制语句.理解函数,ECMAScript 的语法很大程度上借鉴了 C 语言和其他类 C  ...

  9. 《JavaScript高级程序设计 第3版》-学习笔记-1

    P1-P30页 1.<script>标签的属性 async:async(html)  | async="async"(xhtml),表示立即下载脚本,但不马上执行(执行 ...

最新文章

  1. 老鸟谈画图能力对运维人员的重要性
  2. python找人,PythonOpenCV:查找未知人物
  3. Windows 自动登陆的简单方法
  4. 如何使YouTube视频连续循环播放
  5. Spring Cloud部分源码分析Eureka,Ribbon,Feign,Zuul
  6. 【技术贴】Please verify that the Microsoft Data Access
  7. 使用loadrunner进行服务器性能测试(winsocket)
  8. Ubuntu18.04操作系统sudo apt-get update报错
  9. 你我贷CTO冯炯:互联网金融的P2P+O2O怎么做?
  10. 安卓手机免root修改hosts文件
  11. LimeSurvey 安装
  12. 库卡机器人示教器截屏_KUKA库卡机器人示教器维修
  13. linux 下不错的html编辑器bluefish_php_sir_新浪博客
  14. Unity3d用脚本实现Button图片的更改
  15. 常用数据库及默认端口
  16. unity 导入gltf_GLTF相关资料
  17. seaborn调色板 color, hls, cubehelix, dark, diverging_palette
  18. 【云原生】风云暗涌的时代,DBA们的利刃出鞘了
  19. 简明Python教程笔记(一)
  20. php 索引数组应用实例,php数字索引数组实例用法总结

热门文章

  1. Best Cow Line FZU - 1546
  2. 2000亿合作背后:苏宁易购如何成为海尔“兄弟”
  3. Servlet--转发和重定向
  4. 一个网口接网线,另一个网口做转发,用网线连接另一个电脑
  5. 荷兰语翻译软件测试面试,‎App Store 上的“荷兰语学习 - 荷兰语单词和短语 - 荷兰语翻译和发音”...
  6. 英语文字转语音的软件有哪些?推荐三款文字转语音真人发声软件
  7. 给网站添加谷歌验证(我不是机器人)
  8. 怎么保证系统的安全性
  9. java中方法的使用
  10. 贪吃蛇小游戏java实现代码分析