
2024-11-30 日报 Day21

今日的鸡汤
焦虑不会消除明天的悲伤,它只会消耗今天的力量。
今日学习内容
1、JS红皮书P66-70 第三章:语言基础
今日笔记
1、乘性操作符:乘性操作符包括乘法(*)、除法(/)和求模(%)。这些操作符都是二元操作符,因为它们都需要两个值。乘法和除法的优先级相等,而求模的优先级略低。在使用多个乘性操作符时,需要注意它们的执行顺序。如果有多个乘性操作符,那么它们的执行顺序是从左到右。例如:
2、指数操作符:
1 | console.log(Math.pow(2, 3)); // 8 |
3、加性操作符之加法操作符:
如果两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果:
如果有任一操作数是 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”。
看下面的例子:
let result1 = 5 + 5; // 两个数值
console.log(result1); // 10
let result2 = 5 + “5”; // 一个数值和一个字符串
console.log(result2); // “55”
以上代码展示了加法操作符的两种运算模式。正常情况下,5 + 5 等于 10(数值),如前两行代码所示。但是,如果将一个操作数改为字符串,比如”5”,则相加的结果就变成了”55”(原始字符串值),因为第一个操作数也会被转换为字符串。
ECMAScript 中最常犯的一个错误,就是忽略加法操作中涉及的数据类型。比如下面这个例子:
let num1 = 5;
let num2 = 10;
let message = “The sum of 5 and 10 is “ + num1 + num2;
console.log(message); // “The sum of 5 and 10 is 510”
4、加性操作符之减法操作符:
减法操作符(-)也是使用很频繁的一种操作符,比如:
let result = 2 - 1;
与加法操作符一样,减法操作符也有一组规则用于处理 ECMAScript 中不同类型之间的转换。
如果两个操作数都是数值,则执行数学减法运算并返回结果。
如果有任一操作数是 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
5、关系操作符:括小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。这几个操作符都返回布尔值,用于比较两个值的大小关系。在比较两个值时,会遵循如下规则:
如果两个操作数都是数值,则执行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
如果一个操作数是数值,则将另一个操作数转换为数值,然后执行数值比较。
如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执行比较。如果没有 valueOf()方法,则调用 toString()方法,并按照前面的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
5、关系操作符:小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。这几个操作符都返回布尔值,用于比较两个值的大小关系。与 ECMAScript 中的其他操作符一样,在将它们应用到不同数据类型时也会发生类型转换和其他行为。
如果操作数都是数值,则执行数值比较。
如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。
如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。
如果有任一操作数是布尔值,则将其转换为数值再执行比较。
1 | let result = "a" < 3; |
因为字符”a”不能转换成任何有意义的数值,所以只能转换为 NaN。这里有一个规则,即任何关系操作符在涉及比较 NaN 时都返回 false。这样一来,下面的例子有趣了:
1 | let result1 = NaN < 3; // false |
在大多数比较的场景中,如果一个值不小于另一个值,那就一定大于或等于它。但在比较 NaN 时,无论是小于还是大于等于,比较的结果都会返回 false。