JavaScript 基础回顾
章节介绍
在深入学习 Node.js 之前,我们需要先巩固 JavaScript 的基础知识。JavaScript 是 Node.js 的编程语言,掌握 JavaScript 基础对于学习 Node.js 至关重要。本教程将从最基础的概念开始,帮助您回顾和掌握 JavaScript 的核心语法。
核心知识点
变量声明
在 JavaScript 中,我们使用变量来存储数据。现代 JavaScript 提供了三种声明变量的方式:
- var:旧式声明方式,存在变量提升问题
- let:块级作用域变量,推荐使用
- const:声明常量,值不能重新赋值
// 使用 let 声明变量
let name = '张三';
let age = 25;
// 使用 const 声明常量
const PI = 3.14159;
const MAX_SIZE = 100;
// var 的使用(不推荐)
var oldVariable = '旧式变量';命名规则
变量名需要遵循以下规则:
- 只能包含字母、数字、下划线和美元符号
- 不能以数字开头
- 不能使用 JavaScript 保留字
- 区分大小写
// 正确的变量名
let userName = '用户';
let _private = '私有变量';
let $price = 100;
// 错误的变量名
// let 2name = '错误'; // 不能以数字开头
// let class = '错误'; // 不能使用保留字
// let user-name = '错误'; // 不能包含连字符数据类型
JavaScript 有以下基本数据类型:
- 字符串:文本数据
- 数字:整数和浮点数
- 布尔值:true 或 false
- null:表示"无值"
- undefined:表示变量未定义
- Symbol:ES6 新增的唯一标识符
- 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% 的折扣。实现技巧与注意事项
代码风格建议
- 使用 const 和 let:避免使用 var,优先使用 const,需要重新赋值时使用 let
- 有意义的变量名:使用描述性的变量名,提高代码可读性
- 适当的注释:为复杂的逻辑添加注释
- 一致的缩进:使用 2 或 4 个空格进行缩进
常见错误避免
**混淆 == 和 ===**:
// 错误示例 if (0 == '') { // true,可能不是预期的结果 // 正确示例 if (0 === '') { // false,严格比较忘记变量声明:
// 错误示例 function test() { x = 10; // 创建了全局变量 } // 正确示例 function test() { let x = 10; // 局部变量 }类型转换问题:
// 错误示例 let result = '5' - 3; // 2,字符串被转换为数字 let result2 = '5' + 3; // "53",数字被转换为字符串 // 正确示例 let result = parseInt('5') - 3; // 2 let result2 = '5' + String(3); // "53"
调试技巧
使用 console.log:
console.log('变量值:', variable); console.log('对象内容:', JSON.stringify(object, null, 2));使用 console.table:
const users = [ { name: '张三', age: 25 }, { name: '李四', age: 30 } ]; console.table(users);使用条件断点:
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 的。
通过本集的学习,您应该能够:
- 正确声明和使用变量
- 理解 JavaScript 的基本数据类型
- 熟练使用各种运算符
- 编写条件语句进行逻辑判断
- 处理字符串和数字的基本操作
- 避免常见的编程错误
在下一集中,我们将深入学习 JavaScript 的函数与作用域,这是 JavaScript 编程的核心概念之一。继续加油,您的 Node.js 学习之旅正在稳步前进!