写在前头
大多数小伙伴看技术书籍都会用“啃”来描述读书的直观感受,当然我也是一个前端小白,白的透明那种,但是我在读技术书籍感觉到“啃”的时候,我希望把我啃红宝书第四版的过程的想法,总结带给大家,以供后来者能够更快上手。
注: 本文由于作者水平原因,如有错误之处,恳请大家指正,另外随着学习的深入,体会的加深,我会不断回来更新,修改这类文章。
思维导图
脉络 3.5操作符
这小节就是介绍了3.5操作符
3.5操作符
简述
操作符,顾名思义就是用来操作数据值的一种符号。书上的解释也很详细,还涉及了使用方法转换对象,以便操作。
3.5.3. 乘性操作符
和之前加性操作符类型差不多,都是和数学知识差不多,但是得记住一下特别的。书中讲了这些例子。
- 乘法操作符
- 计算两个数值的乘积
同数学乘法类似。
- 处理特殊值
① 如果有不是数值的操作数,则先在后台用 Number()将其转换为数值,然后再应用上述规则。 ②如果 ECMAScript 不能表示乘积,则返回 Infinity 或-Infinity。
```JavaScript <script> console.log(2 * 3); // 6 console.log(NaN * 3); // NaN console.log(Infinity * 3); // Infinity console.log(Infinity * -3); // -Infinity console.log(Infinity * Infinity); //Infinity console.log('2' * 3); // 6 </script> 复制代码
复制代码
- 除法操作符
- 计算第一个操作数除以第二个操作数的商
同数学除法类似。
- 处理特殊值
<script> console.log(3 / 2); // 1.5 c语言是1,js不取整 console.log(NaN / 2); // NaN console.log(Infinity / Infinity); // NaN console.log(0 / 0); // NaN console.log(3 / 0); // Infinity console.log(-3 / 0); // -Infinity </script> 复制代码
- 取余操作符
- 数值
<script> console.log(26 % 3); // 2 </script> 复制代码
- 处理特殊值
<script> console.log(Infinity % 3); // NaN console.log(-Infinity % 3); // NaN console.log(888 % 0); // NaN console.log(Infinity % Infinity); // NaN console.log(888 % Infinity); // 888 console.log(888 % -Infinity); // 888 console.log(0 / 8); // 0 </script> 复制代码
3.5.4. 指数操作符
- Math.pow()自己的操作符(2个**)
<script> console.log(3 ** 2); // 9 console.log(Math.pow(3, 2)); // 9 </script> 复制代码
3.5.5. 位操作符
基本原理
- 二进制编码存储
所有的计算机存储的内容最终都是二进制构成的。
- 32 位转换为 64 位
64位转换为32位,位操作符执行,再32位转换64位。这里我觉得书也得很好,我自己也讲不好。多看书吧。
- 副作用
特殊值 NaN 和 Infinity在位操作中都会被当成 0 处理。
注意:输出负数时,是对应进制的正数再带一个负号。
let num = -18; console.log(num.toString(2)); // '-10010' 复制代码
1. 按位非
- 是二进制数学操作符
- 返回数值的一补数
32位每一位0换1,1换0。
- 位操作的速度快
原因:位操作是更底层的操作比加性操作符等等更快。
- 两个按位非操作符效果上等同于 Math.trunc()
function test = (number) => ~~number === Math.trunc(number); console.log(test(1.05)); // true console.log(test(-1.05)); // true // 不同之处 console.log(Math.trunc(NaN)); // NaN console.log(~~NaN); // 0 console.log(Math.trunc(Infinity)); // Infinity console.log(~~Infinity); // 0 复制代码
2. 按位与
有0则0 在两个位都是 1 时返回 1,在任何一位是 0 时返回 0
3. 按位或
有1则1:至少一位是 1 时返回 1,两位都是 0 时返回 0
4. 按位异或
同0异1:比对同样两个值执行按位或操作得到的结果小 1
5. 左移
按照指定的位数将数值的所有位向左移动,左移会以 0 填充这些空位,让结果是完整的 32 位数值。
6. 有符号右移
- 会将数值的所有 32 位都向右移,同时保留符号。
- 左移的逆运算
- 会用符号位的值来填充这些空位
7. 无符号右移
- 会将数值的所有 32 位都向右移
- 无符号右移会给空位补 0,而不管符号位是什么。