欢迎来到 JavaScript 数学运算的全面回顾!本篇博客将带你深入了解 JavaScript 中数字数据类型、运算符、类型转换、优先级以及各种内置方法,助你更好地驾驭数字世界。


数字数据类型 (Number Data Type)

在 JavaScript 中,Number 类型不仅包括整数,还涵盖了浮点数(带小数点的数字)、InfinityNaNInfinity 代表一个比任何其他数字都大的数,而 -Infinity 则代表比任何其他数字都小的数。NaN(Not a Number,非数字)是一个特殊的标记,表示一个无效的数值,例如将字符串 "Jessica" 强制转换为数字时得到的结果。


常见算术运算符

JavaScript 提供了一系列标准的算术运算符,用于执行基本的数学计算:

  • 加法 (+): 用于求两个或多个数字的和。
  • 减法 (-): 用于求两个数字的差。
  • 乘法 (*)**: 用于求两个或多个数字的积。
  • 除法 (/): 用于求两个数字的商。
  • 除以零: 当你尝试除以零时,JavaScript 会返回 Infinity
  • 取余 (%): 返回除法的余数。
  • 幂运算 (**)**: 将一个数提升为另一个数的幂。

数字与字符串的运算

在 JavaScript 中,当数字和字符串进行运算时,会发生类型强制转换(coercion)。

  • 当使用 + 运算符时,JavaScript 会将数字强制转换为字符串,然后将两个值连接起来。
  • 当使用 -*/ 运算符时,JavaScript 会尝试将字符串强制转换为数字,然后进行计算,结果是一个数字。
  • 对于 nullundefined,在数学运算中,null 被当作 0,而 undefined 被当作 NaN
const result = 5 + '10'; // 510,类型为 string

const subtractionResult = '10' - 5; // 5,类型为 number

const result1 = null + 5; // 5
const result2 = undefined + 5; // NaN

运算符优先级

运算符优先级决定了表达式中操作的执行顺序。高优先级的运算符会先被计算。例如,括号内的值会首先被计算,乘法和除法的优先级高于加法和减法。如果运算符具有相同的优先级,JavaScript 会根据结合性(associativity)来决定执行顺序。

结合性规定了当多个相同优先级的运算符存在时,表达式是从左到右还是从右到左计算。例如,幂运算(**)是右结合的。

const result = (2 + 3) * 4; // 20,括号内先计算

const result2 = 10 - 2 + 3; // 11,从左到右计算

const result3 = 2 ** 3 ** 2; // 512,从右到左计算 (3**2)

自增与自减运算符

  • 自增运算符 (++): 将变量的值增加一。
    • 前缀形式 (++num): 先增加变量的值,然后返回新值。
    • 后缀形式 (num++): 先返回当前变量的值,然后增加它。
  • 自减运算符 (--): 将变量的值减少一。前缀和后缀形式的工作方式与自增运算符相同。
let x = 5;
console.log(++x); // 6
console.log(x); // 6

let y = 5;
console.log(y++); // 5
console.log(y); // 6

复合赋值运算符

复合赋值运算符是标准算术运算和赋值操作的简写形式。例如,+= 运算符将右侧的值加到左侧变量上,并将结果重新赋值给该变量。

  • +=-=*=/=%=**=

布尔值与相等性

  • 布尔值 (Boolean): 是一种只有两个值的数据类型:truefalse
  • 相等运算符 (==): 在检查值是否相等前会进行类型强制转换
    console.log(5 == '5'); // true
    
  • 严格相等运算符 (===): 进行类型强制转换,同时检查值和类型是否都相等。
    console.log(5 === '5'); // false
    
  • 此外还有不相等 (!=) 和严格不相等 (!==) 运算符,它们的工作方式类似。

比较运算符

比较运算符用于比较两个值,并返回一个布尔值 (truefalse)。

  • > (大于)
  • >= (大于或等于)
  • < (小于)
  • <= (小于或等于)

一元运算符 (Unary Operators)

一元运算符只对一个操作数进行操作。

  • 一元加号 (+): 将其操作数转换为数字。
    const str = '42';
    const num = +str; // 42,类型为 number
    
  • 一元减号 (-): 对操作数取反。
  • 逻辑非 (!): 翻转其操作数的布尔值。

条件语句、真值与假值

  • if/else if/else: if 语句检查一个条件,如果条件为真值(truthy),则执行代码块。真值是在布尔上下文中被评估为 true 的任何值。相反,假值(falsy)是评估为 false 的值,包括 false0"" (空字符串)、nullundefinedNaN
    const score = 87;
    if (score >= 90) { /* ... */ } else if (score >= 80) {
      console.log('You got a B'); // 输出: You got a B
    }
    
  • 三元运算符 (Ternary Operator): 一种更简洁的 if/else 语句写法。
    const temperature = 30;
    const weather = temperature > 25 ? 'sunny' : 'cool';
    console.log(`It's a ${weather} day!`); // 输出: It's a sunny day!
    

二元逻辑运算符 (Binary Logical Operators)

  • 逻辑与 (&&): 检查两个操作数是否都为真。
  • 逻辑或 (||): 检查至少一个操作数是否为真。
  • 空值合并 (??): 仅当第一个操作数为 nullundefined 时,才返回第二个值。
    const userSettings = { theme: null };
    let theme = userSettings.theme ?? 'light';
    console.log(theme); // 输出: light
    

Math 对象

Math 对象提供了许多数学常量和方法。

  • Math.random(): 生成一个介于 0(包含)和 1(不包含)之间的随机浮点数。
  • Math.max() & Math.min(): 返回一组数字中的最大或最小值。
  • Math.ceil(): 向上取整到最接近的整数。
  • Math.floor(): 向下取整到最接近的整数。
  • Math.round(): 四舍五入到最接近的整数。
  • Math.trunc(): 移除数字的小数部分,不进行四舍五入。
  • Math.sqrt() & Math.cbrt(): 返回一个数的平方根或立方根。
  • Math.abs(): 返回一个数的绝对值。
  • Math.pow(): 将第一个数提升为第二个数的幂。

常见数字方法

  • isNaN(): 全局函数 isNaN()Number.isNaN() 用于检查一个值是否为 NaNNumber.isNaN() 更可靠,因为它不会进行类型强制转换。
    console.log(isNaN("NaN")); // true (全局函数会尝试转换)
    console.log(Number.isNaN("NaN")); // false (Number.isNaN 不会转换)
    
  • parseFloat(): 解析一个字符串并返回一个浮点数
  • parseInt(): 解析一个字符串并返回一个整数。它会在遇到第一个非数字字符时停止解析。
  • toFixed(): 在一个数字上调用,并返回该数字的字符串表示,保留指定位数的小数。

希望这篇回顾能帮助你巩固 JavaScript 数学知识!

更多推荐