JavaScript 基础回顾

章节介绍

在深入学习 Node.js 之前,我们需要先巩固 JavaScript 的基础知识。JavaScript 是 Node.js 的编程语言,掌握 JavaScript 基础对于学习 Node.js 至关重要。本教程将从最基础的概念开始,帮助您回顾和掌握 JavaScript 的核心语法。

核心知识点

变量声明

在 JavaScript 中,我们使用变量来存储数据。现代 JavaScript 提供了三种声明变量的方式:

  1. var:旧式声明方式,存在变量提升问题
  2. let:块级作用域变量,推荐使用
  3. const:声明常量,值不能重新赋值
// 使用 let 声明变量
let name = '张三';
let age = 25;

// 使用 const 声明常量
const PI = 3.14159;
const MAX_SIZE = 100;

// var 的使用(不推荐)
var oldVariable = '旧式变量';

命名规则

变量名需要遵循以下规则:

  1. 只能包含字母、数字、下划线和美元符号
  2. 不能以数字开头
  3. 不能使用 JavaScript 保留字
  4. 区分大小写
// 正确的变量名
let userName = '用户';
let _private = '私有变量';
let $price = 100;

// 错误的变量名
// let 2name = '错误';        // 不能以数字开头
// let class = '错误';         // 不能使用保留字
// let user-name = '错误';     // 不能包含连字符

数据类型

JavaScript 有以下基本数据类型:

  1. 字符串:文本数据
  2. 数字:整数和浮点数
  3. 布尔值:true 或 false
  4. null:表示"无值"
  5. undefined:表示变量未定义
  6. Symbol:ES6 新增的唯一标识符
  7. BigInt:ES10 新增的大整数类型
// 字符串
let text = 'Hello World';
let message = "JavaScript 很有趣";

// 数字
let integer = 42;
let float = 3.14;
let negative = -10;

// 布尔值
let isActive = true;
let isComplete = false;

// null 和 undefined
let emptyValue = null;
let notDefined = undefined;

// 检查数据类型
console.log(typeof text);        // "string"
console.log(typeof integer);     // "number"
console.log(typeof isActive);    // "boolean"
console.log(typeof emptyValue);  // "object"
console.log(typeof notDefined);  // "undefined"

运算符

JavaScript 支持多种运算符:

算术运算符

let a = 10;
let b = 3;

console.log(a + b);    // 13  加法
console.log(a - b);    // 7   减法
console.log(a * b);    // 30  乘法
console.log(a / b);    // 3.333... 除法
console.log(a % b);    // 1   取模(余数)
console.log(a ** b);   // 1000 幂运算

// 自增和自减
let count = 5;
count++;              // 6
count--;              // 5

比较运算符

let x = 5;
let y = '5';

console.log(x == y);   // true  相等(类型转换)
console.log(x === y);  // false 严格相等(不转换类型)
console.log(x != y);   // false 不等
console.log(x !== y);  // true 严格不等
console.log(x > y);    // false 大于
console.log(x < y);    // false 小于
console.log(x >= y);   // true 大于等于
console.log(x <= y);   // true 小于等于

逻辑运算符

let a = true;
let b = false;

console.log(a && b);   // false 逻辑与(两个都为 true 才返回 true)
console.log(a || b);   // true   逻辑或(有一个为 true 就返回 true)
console.log(!a);       // false 逻辑非(取反)

// 短路求值
let result = a || '默认值';  // true(a 为 true,不会执行右边)
let result2 = b && '执行';    // false(b 为 false,不会执行右边)

赋值运算符

let x = 10;

x += 5;    // x = x + 5;   // 15
x -= 3;    // x = x - 3;   // 12
x *= 2;    // x = x * 2;   // 24
x /= 4;    // x = x / 4;   // 6
x %= 4;    // x = x % 4;   // 2

条件语句

条件语句用于根据不同的条件执行不同的代码。

if 语句

let score = 85;

if (score >= 90) {
  console.log('优秀');
} else if (score >= 80) {
  console.log('良好');
} else if (score >= 60) {
  console.log('及格');
} else {
  console.log('不及格');
}
// 输出:良好

switch 语句

let day = '星期一';

switch (day) {
  case '星期一':
    console.log('新的一周开始了!');
    break;
  case '星期五':
    console.log('周末快到了!');
    break;
  case '星期六':
  case '星期日':
    console.log('周末愉快!');
    break;
  default:
    console.log('普通的一天');
}

三元运算符

let age = 18;
let status = age >= 18 ? '成年' : '未成年';
console.log(status);  // 成年

// 嵌套使用
let score = 75;
let grade = score >= 90 ? 'A' : 
            score >= 80 ? 'B' : 
            score >= 70 ? 'C' : 
            score >= 60 ? 'D' : 'F';
console.log(grade);  // C

字符串操作

let str = 'Hello World';

// 字符串长度
console.log(str.length);  // 11

// 大小写转换
console.log(str.toUpperCase());  // "HELLO WORLD"
console.log(str.toLowerCase());  // "hello world"

// 字符串拼接
let name = '张三';
let greeting = '你好,' + name + '!';
console.log(greeting);  // 你好,张三!

// 模板字符串(ES6)
let greeting2 = `你好,${name}!`;
console.log(greeting2);  // 你好,张三!

// 字符串查找
console.log(str.indexOf('World'));    // 6
console.log(str.includes('World'));  // true

// 字符串截取
console.log(str.substring(0, 5));  // "Hello"
console.log(str.slice(-6));          // "World"

// 字符串替换
console.log(str.replace('World', 'Node.js'));  // "Hello Node.js"

// 去除空格
let spaced = '  hello  ';
console.log(spaced.trim());  // "hello"

数字操作

let num = 123.456;

// 数字格式化
console.log(num.toFixed(2));    // "123.46" 保留两位小数
console.log(num.toPrecision(4));  // "123.5" 保留有效数字

// 数字转换
console.log(parseInt('123'));      // 123
console.log(parseFloat('123.45')); // 123.45
console.log(Number('123'));       // 123

// 数学函数
console.log(Math.round(4.5));   // 5   四舍五入
console.log(Math.floor(4.9));   // 4   向下取整
console.log(Math.ceil(4.1));    // 5   向上取整
console.log(Math.abs(-5));       // 5   绝对值
console.log(Math.max(1, 3, 2)); // 3   最大值
console.log(Math.min(1, 3, 2)); // 1   最小值
console.log(Math.random());      // 0-1 之间的随机数

// 生成指定范围的随机数
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandomInt(1, 100));  // 1-100 之间的随机整数

实用案例分析

案例 1:简单的计算器程序

让我们创建一个简单的计算器,能够进行基本的算术运算。

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

function calculate(num1, num2, operator) {
  let result;
  
  switch (operator) {
    case '+':
      result = num1 + num2;
      break;
    case '-':
      result = num1 - num2;
      break;
    case '*':
      result = num1 * num2;
      break;
    case '/':
      if (num2 === 0) {
        return '错误:除数不能为零';
      }
      result = num1 / num2;
      break;
    default:
      return '错误:不支持的运算符';
  }
  
  return `${num1} ${operator} ${num2} = ${result}`;
}

rl.question('请输入第一个数字:', (num1) => {
  rl.question('请输入运算符(+、-、*、/):', (operator) => {
    rl.question('请输入第二个数字:', (num2) => {
      const n1 = parseFloat(num1);
      const n2 = parseFloat(num2);
      
      if (isNaN(n1) || isNaN(n2)) {
        console.log('错误:请输入有效的数字');
      } else {
        console.log('\n计算结果:');
        console.log(calculate(n1, n2, operator));
      }
      
      rl.close();
    });
  });
});

案例 2:学生成绩评定系统

创建一个成绩评定系统,根据分数给出等级和评语。

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

function evaluateGrade(score) {
  let grade, comment;
  
  if (score < 0 || score > 100) {
    return {
      grade: '无效',
      comment: '分数必须在 0-100 之间'
    };
  }
  
  if (score >= 90) {
    grade = 'A';
    comment = '优秀!继续保持!';
  } else if (score >= 80) {
    grade = 'B';
    comment = '良好,还有进步空间!';
  } else if (score >= 70) {
    grade = 'C';
    comment = '中等,需要更加努力!';
  } else if (score >= 60) {
    grade = 'D';
    comment = '及格,要加油了!';
  } else {
    grade = 'F';
    comment = '不及格,需要重点补习!';
  }
  
  return { grade, comment };
}

rl.question('请输入学生成绩(0-100):', (input) => {
  const score = parseFloat(input);
  
  if (isNaN(score)) {
    console.log('错误:请输入有效的数字');
  } else {
    const result = evaluateGrade(score);
    console.log('\n成绩评定结果:');
    console.log(`等级:${result.grade}`);
    console.log(`评语:${result.comment}`);
  }
  
  rl.close();
});

案例 3:简单的猜数字游戏

创建一个猜数字游戏,让用户猜测 1-100 之间的随机数。

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// 生成 1-100 之间的随机数
const targetNumber = Math.floor(Math.random() * 100) + 1;
let attempts = 0;
const maxAttempts = 10;

function guessNumber() {
  rl.question(`\n请输入您的猜测(1-100),剩余次数:${maxAttempts - attempts}:`, (input) => {
    const guess = parseInt(input);
    attempts++;
    
    if (isNaN(guess) || guess < 1 || guess > 100) {
      console.log('请输入 1-100 之间的有效数字!');
    } else if (guess === targetNumber) {
      console.log(`\n恭喜您!您猜对了!数字是 ${targetNumber}`);
      console.log(`您用了 ${attempts} 次猜测。`);
      rl.close();
      return;
    } else if (attempts >= maxAttempts) {
      console.log(`\n很遗憾,您没有猜对。正确答案是 ${targetNumber}`);
      rl.close();
      return;
    } else {
      if (guess < targetNumber) {
        console.log('太小了!再试一次。');
      } else {
        console.log('太大了!再试一次。');
      }
    }
    
    guessNumber();
  });
}

console.log('欢迎来到猜数字游戏!');
console.log('我已经想好了一个 1-100 之间的数字,请您来猜一猜。');
console.log(`您有 ${maxAttempts} 次机会。`);

guessNumber();

代码示例

示例 1:变量作用域演示

// 全局作用域
let globalVar = '全局变量';

function demonstrateScope() {
  // 函数作用域
  let localVar = '局部变量';
  
  console.log(globalVar);  // 可以访问全局变量
  console.log(localVar);   // 可以访问局部变量
  
  // 块级作用域
  if (true) {
    let blockVar = '块级变量';
    console.log(blockVar);  // 可以访问块级变量
  }
  
  // console.log(blockVar);  // 错误:无法访问块级变量
}

demonstrateScope();
// console.log(localVar);  // 错误:无法访问函数局部变量

示例 2:数据类型转换

// 字符串转数字
let str1 = '123';
let str2 = '123.45';
let str3 = 'abc';

console.log(Number(str1));      // 123
console.log(Number(str2));      // 123.45
console.log(Number(str3));      // NaN

console.log(parseInt(str1));     // 123
console.log(parseFloat(str2));   // 123.45

// 数字转字符串
let num1 = 123;
let num2 = 45.67;

console.log(String(num1));      // "123"
console.log(num1.toString());    // "123"
console.log(num2.toFixed(2));  // "45.67"

// 布尔值转换
console.log(Boolean(0));        // false
console.log(Boolean(1));        // true
console.log(Boolean(''));       // false
console.log(Boolean('text'));   // true
console.log(Boolean(null));      // false
console.log(Boolean(undefined)); // false

示例 3:条件语句综合应用

function checkEligibility(age, hasLicense, hasInsurance) {
  // 检查年龄
  if (age < 18) {
    return '您还未满 18 岁,不能驾驶。';
  }
  
  // 检查驾照
  if (!hasLicense) {
    return '您没有驾照,不能驾驶。';
  }
  
  // 检查保险
  if (!hasInsurance) {
    return '您没有保险,不能驾驶。';
  }
  
  // 所有条件都满足
  return '您可以安全驾驶!';
}

console.log(checkEligibility(20, true, true));    // 可以安全驾驶!
console.log(checkEligibility(16, true, true));    // 您还未满 18 岁,不能驾驶。
console.log(checkEligibility(25, false, true));   // 您没有驾照,不能驾驶。
console.log(checkEligibility(30, true, false));  // 您没有保险,不能驾驶。

// 使用三元运算符简化
function getDiscount(age, isMember) {
  const ageDiscount = age >= 60 ? 0.2 : (age >= 50 ? 0.1 : 0);
  const memberDiscount = isMember ? 0.15 : 0;
  const totalDiscount = ageDiscount + memberDiscount;
  
  return `您享受 ${totalDiscount * 100}% 的折扣。`;
}

console.log(getDiscount(65, true));   // 您享受 35% 的折扣。
console.log(getDiscount(55, false));  // 您享受 10% 的折扣。
console.log(getDiscount(30, true));   // 您享受 15% 的折扣。

实现技巧与注意事项

代码风格建议

  1. 使用 const 和 let:避免使用 var,优先使用 const,需要重新赋值时使用 let
  2. 有意义的变量名:使用描述性的变量名,提高代码可读性
  3. 适当的注释:为复杂的逻辑添加注释
  4. 一致的缩进:使用 2 或 4 个空格进行缩进

常见错误避免

  1. **混淆 == 和 ===**:

    // 错误示例
    if (0 == '') {  // true,可能不是预期的结果
    
    // 正确示例
    if (0 === '') {  // false,严格比较
  2. 忘记变量声明

    // 错误示例
    function test() {
      x = 10;  // 创建了全局变量
    }
    
    // 正确示例
    function test() {
      let x = 10;  // 局部变量
    }
  3. 类型转换问题

    // 错误示例
    let result = '5' - 3;  // 2,字符串被转换为数字
    let result2 = '5' + 3; // "53",数字被转换为字符串
    
    // 正确示例
    let result = parseInt('5') - 3;  // 2
    let result2 = '5' + String(3); // "53"

调试技巧

  1. 使用 console.log

    console.log('变量值:', variable);
    console.log('对象内容:', JSON.stringify(object, null, 2));
  2. 使用 console.table

    const users = [
      { name: '张三', age: 25 },
      { name: '李四', age: 30 }
    ];
    console.table(users);
  3. 使用条件断点

    if (someCondition) {
      debugger;  // 在这里暂停执行
    }

常见问题与解决方案

问题 1:变量未定义错误

错误信息ReferenceError: xxx is not defined

原因:使用了未声明的变量

解决方案

// 错误示例
console.log(myVariable);  // ReferenceError

// 正确示例
let myVariable = 'Hello';
console.log(myVariable);  // "Hello"

问题 2:类型转换导致的意外结果

错误示例

console.log('10' - 5);   // 5(字符串转数字)
console.log('10' + 5);   // "105"(数字转字符串)
console.log('10' * 5);   // 50(字符串转数字)
console.log('10' / 5);   // 2(字符串转数字)

解决方案

// 明确进行类型转换
console.log(parseInt('10') + 5);  // 15
console.log(String(10) + 5);     // "105"

问题 3:浮点数精度问题

错误示例

console.log(0.1 + 0.2);  // 0.30000000000000000004
console.log(0.1 * 3);    // 0.30000000000000000004

解决方案

// 使用 toFixed() 方法
console.log((0.1 + 0.2).toFixed(2));  // "0.30"
console.log(parseFloat((0.1 + 0.2).toFixed(2)));  // 0.3

// 或者使用整数运算
console.log((1 + 2) / 10);  // 0.3

问题 4:条件判断逻辑错误

错误示例

let score = 85;
if (score >= 60) {
  console.log('及格');
} else if (score >= 80) {
  console.log('良好');  // 永远不会执行
} else if (score >= 90) {
  console.log('优秀');  // 永远不会执行
}

解决方案

// 从高到低判断
let score = 85;
if (score >= 90) {
  console.log('优秀');
} else if (score >= 80) {
  console.log('良好');  // 会执行
} else if (score >= 60) {
  console.log('及格');
} else {
  console.log('不及格');
}

总结

本教程回顾了 JavaScript 的基础知识,包括变量声明、数据类型、运算符和条件语句。这些基础概念对于学习 Node.js 至关重要,因为 Node.js 就是基于 JavaScript 的。

通过本集的学习,您应该能够:

  1. 正确声明和使用变量
  2. 理解 JavaScript 的基本数据类型
  3. 熟练使用各种运算符
  4. 编写条件语句进行逻辑判断
  5. 处理字符串和数字的基本操作
  6. 避免常见的编程错误

在下一集中,我们将深入学习 JavaScript 的函数与作用域,这是 JavaScript 编程的核心概念之一。继续加油,您的 Node.js 学习之旅正在稳步前进!

« 上一篇 Node.js 简介与环境搭建 下一篇 » JavaScript 函数与作用域