JavaScript 完整学习指南
目录
-
(图片来源网络,侵删)- 简介
- 它能做什么?
- 它与 HTML 和 CSS 的关系
-
- 工具:代码编辑器
- 运行环境:浏览器控制台
-
script- 变量 (
let,const,var)- 数据类型
- 注释
- 运算符
- 条件语句 (
if...else,switch)- 循环语句 (
for,while)- 变量 (
-
- 函数声明与表达式
- 参数与返回值
- 作用域
-
(图片来源网络,侵删)- 对象
- 数组
- 常用方法
-
- 什么是 DOM?
- 选择元素
- 与样式
- 处理事件
-
- 什么是异步?
Promise和async/await- Fetch API (从服务器获取数据)
-
- ES6+ 新特性简介
- 错误处理 (
try...catch) - 模块化
-
- 学习路线图
- 推荐教程与文档
第一部分:JavaScript 是什么?
简介
JavaScript (简称 JS) 是一种轻量级的、解释型的、或即时编译型的编程语言,它是一种基于原型、多范式的动态脚本语言,并且支持面向对象、命令式和声明式风格。
JavaScript 是网页的“行为层”,如果说 HTML 是网页的“骨架”(结构),CSS 是网页的“衣服”(样式),JavaScript 就是网页的“大脑和肌肉”(交互和逻辑)。
它能做什么?
- 网页交互:响应用户操作,如点击按钮、填写表单、悬停效果等。
- 更新:无需刷新页面,即可更新网页内容(社交媒体的动态加载)。
- 表单验证:在用户提交数据前,检查输入是否合法。
- 动画效果:创建复杂的网页动画和过渡效果。
- 网络通信:与服务器进行数据交换(AJAX/Fetch),实现前后端分离的应用。
- 服务器端开发:使用 Node.js,JavaScript 也可以用于编写服务器端代码。
- 移动应用开发:使用 React Native, Flutter 等框架开发跨平台移动应用。
它与 HTML 和 CSS 的关系
- HTML (HyperText Markup Language):定义网页的结构和内容。
<h1>是标题,<p>是段落。 - CSS (Cascading Style Sheets):负责网页的视觉表现,如颜色、布局、字体等。
- JavaScript:负责网页的行为和逻辑,控制 HTML 和 CSS,实现动态效果。
这三者共同构成了现代网页的基石。
第二部分:准备工作
在学习 JavaScript 之前,你需要两个基本工具:
-
代码编辑器:一个专门用来编写代码的软件,它能提供语法高亮、自动补全等功能,极大提高开发效率。
- 强烈推荐:Visual Studio Code (VS Code),它是目前最流行、功能最强大的免费代码编辑器。
-
运行环境:JavaScript 代码需要在环境中运行,最简单的方式就是使用浏览器自带的开发者工具。
- 打开开发者工具:
- 在 Chrome 或 Edge 浏览器中,按
F12键,或者右键点击页面选择“检查”。 - 点击 Console (控制台) 标签,这里是 JavaScript 代码的“游乐场”,你可以在这里直接输入代码并看到结果。
- 在 Chrome 或 Edge 浏览器中,按
- 打开开发者工具:
第三部分:JavaScript 基础语法
script
在 HTML 文件中引入 JavaScript 代码有两种主要方式:
-
内部脚本:直接在 HTML 文件中编写。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的第一个 JS</title>
</head>
<body>
<h1>你好,世界!</h1>
<!-- 在这里写 JS 代码 -->
<script>
// 这里的代码会在页面加载时执行
alert("欢迎来到 JavaScript 世界!");
</script>
</body>
</html>
-
外部脚本(推荐):将代码写入一个 .js 文件,然后在 HTML 中引用。
- 创建
script.js 文件:// script.js
alert("这是来自外部文件的问候!");
- 在 HTML 中引用:
<script src="script.js"></script>
注意:<script> 标签通常放在 <body> 的末尾,这样可以确保在脚本执行前,页面的 HTML 元素已经完全加载。
变量
变量是存储数据值的容器,ES6 推荐使用 let 和 const。
let:用于声明可以重新赋值的变量。let message = "你好";
message = "你好,世界!"; // 可以重新赋值
const:用于声明常量,一旦赋值就不能再改变。const PI = 3.14159;
// PI = 4; // 这会报错
var:旧的声明方式,存在一些问题(如函数作用域和变量提升),不推荐在新的项目中使用。
数据类型
JavaScript 是一种动态类型语言,变量的类型可以在运行时改变。
- 字符串:文本,用单引号或双引号括起来。
let name = "张三";
let greeting = '你好';
- 数字:整数或浮点数。
let age = 25;
let price = 99.99;
- 布尔值:
true 或 false,通常用于条件判断。let isStudent = true;
let isWorking = false;
- 未定义:
undefined,表示变量已声明但未赋值。let x;
console.log(x); // 输出 undefined
- 空值:
null,表示“空值”或“无值”。let data = null;
- 对象:复杂数据类型,用于存储键值对集合。
let person = { name: "李四", age: 30 };
- 数组:用于存储有序的值列表。
let colors = ["红色", "绿色", "蓝色"];
注释
注释是代码中不被执行的说明,用于解释代码。
- 单行注释:
// 这是一个单行注释
let a = 1;
- 多行注释:
/*
这是一个
多行注释
*/
let b = 2;
运算符
- 算术运算符:, , , , (取余)
console.log(10 + 5); // 15
console.log(10 % 3); // 1
- 赋值运算符:, , , etc.
let x = 10;
x += 5; // 等同于 x = x + 5; x 现在是 15
- 比较运算符:, , , ,
>, <, >=, <=
- 值相等 (会进行类型转换)
- 值和类型都相等 (推荐使用)
console.log(5 == "5"); // true
console.log(5 === "5"); // false
- 逻辑运算符:
&& (与), (或), (非)let sunny = true;
let warm = false;
console.log(sunny && warm); // false (
console.log(sunny || warm); // true (或者)
console.log(!sunny); // false (非)
条件语句
根据不同的条件执行不同的代码。
if...elselet hour = 20;
if (hour < 12) {
console.log("早上好!");
} else if (hour < 18) {
console.log("下午好!");
} else {
console.log("晚上好!");
}
switchlet day = "Monday";
switch (day) {
case "Monday":
console.log("新的一周开始了。");
break;
case "Friday":
console.log("周末快到了!");
break;
default:
console.log("普通的一天。");
}
循环语句
重复执行一段代码。
for 循环:在循环次数已知时使用。// 打印 0 到 4
for (let i = 0; i < 5; i++) {
console.log(i);
}
while 循环:在条件为 true 时持续循环。let count = 0;
while (count < 5) {
console.log(count);
count++; // 别忘了增加计数器,否则会无限循环
}
第四部分:函数
函数是可以重复使用的代码块,用于执行特定的任务。
函数声明与表达式
-
函数声明
function greet(name) {
return "你好, " + name + "!";
}
-
函数表达式 (更常见,特别是箭头函数)
const greet = function(name) {
return "你好, " + name + "!";
};
// ES6 箭头函数 - 更简洁
const greetArrow = (name) => {
return `你好, ${name}!`; // 使用模板字符串
};
// 如果函数体只有一行返回值,可以更简化
const greetSimple = (name) => `你好, ${name}!`;
参数与返回值
- 参数:函数的输入,在函数名后的括号中定义。
- 返回值:函数的输出,使用
return 关键字返回,函数执行到 return 语句后会立即停止。
function add(a, b) {
return a + b; // 返回 a 和 b 的和
}
let sum = add(5, 3);
console.log(sum); // 输出 8
作用域
作用域决定了变量和函数的可访问性。
-
全局作用域:在任何地方都可以访问。
-
函数作用域:在函数内部定义的变量,只能在函数内部访问。
let globalVar = "我是全局变量";
function myFunction() {
let functionVar = "我是函数变量";
console.log(globalVar); // 可以访问
console.log(functionVar); // 可以访问
}
console.log(globalVar); // 可以访问
// console.log(functionVar); // 报错!无法访问
第五部分:对象与数组
对象
对象是键值对的集合,用于存储更复杂的数据。
-
创建对象
let car = {
brand: "Toyota",
model: "Camry",
year: 2025,
start: function() {
console.log("引擎启动!");
}
};
-
访问属性和方法
console.log(car.brand); // 使用点表示法
console.log(car["model"]); // 使用方括号表示法(适用于属性名有空格或变量时)
car.start(); // 调用方法
-
修改属性
car.year = 2025;
console.log(car.year); // 2025
数组
数组用于存储有序的值列表。
- 创建数组
let fruits = ["苹果", "香蕉", "橙子"];
let numbers = [1, 2, 3, 4, 5];
- 访问元素
console.log(fruits[0]); // 索引从 0 开始,输出 "苹果"
- 修改元素
fruits[1] = "葡萄";
console.log(fruits); // ["苹果", "葡萄", "橙子"]
常用方法
- 数组方法
push():在数组末尾添加一个或多个元素。
pop():删除并返回数组的最后一个元素。
shift():删除并返回数组的第一个元素。
unshift():在数组开头添加一个或多个元素。
length:获取数组的长度。let colors = ["红", "绿"];
colors.push("蓝"); // colors 现在是 ["红", "绿", "蓝"]
colors.pop(); // 返回 "蓝", colors 现在是 ["红", "绿"]
- 对象方法
Object.keys():获取对象的所有键。
Object.values():获取对象的所有值。let user = { name: "王五", age: 28 };
console.log(Object.keys(user)); // ["name", "age"]
console.log(Object.values(user)); // ["王五", 28]
第六部分:DOM 操作 - 让网页“活”起来
DOM (Document Object Model) 是 HTML 和 XML 文档的编程接口,它将文档表示为一个树形结构,JavaScript 可以通过 DOM 来访问和修改文档的内容、结构和样式。
什么是 DOM?
当浏览器加载一个 HTML 页面时,它会将其转换成一个“文档对象模型”(DOM树),JavaScript 可以通过这个树来“触摸”和“操控”HTML 元素。
选择元素
在操作元素之前,首先要选中它。
getElementById():通过 ID 选择。<p id="intro">这是一个介绍。</p>
let introElement = document.getElementById("intro");
querySelector():通过 CSS 选择器(最常用、最强大)。<p class="text">这是一段文本。</p>
<ul>
<li>项目1</li>
<li>项目2</li>
</ul>
let firstText = document.querySelector(".text"); // 选择 class 为 "text" 的第一个元素
let firstLi = document.querySelector("ul li"); // 选择 ul 下的第一个 li
querySelectorAll():选择所有匹配的元素,返回一个 NodeList(类数组)。let allLis = document.querySelectorAll("li"); // 选择所有的 li
与样式
element.textContent:获取或设置元素的文本内容(不解析 HTML 标签)。
element.innerHTML:获取或设置元素的 HTML 内容(会解析 HTML 标签)。let intro = document.getElementById("intro");
intro.textContent = "文本内容已更新!";
intro.innerHTML = "<strong>HTML 内容已更新!</strong>";
- 修改样式
element.style.property:修改内联样式。let intro = document.getElementById("intro");
intro.style.color = "blue";
intro.style.fontSize = "20px";
处理事件
事件是用户或浏览器执行的某种动作,如点击、鼠标悬停、键盘按下等,我们可以让 JavaScript 监听这些事件并做出响应。
-
添加事件监听器
<button id="myButton">点击我</button>
<p id="message"></p>
let button = document.getElementById("myButton");
let message = document.getElementById("message");
button.addEventListener("click", function() {
message.textContent = "按钮被点击了!";
message.style.color = "green";
});
常见事件:click, mouseover, mouseout, keydown, load 等。
第七部分:异步编程与 API
什么是异步?
在 JavaScript 中,代码通常是同步执行的,即一行一行地按顺序执行,但有些操作(如网络请求、读取文件)可能需要很长时间,如果这些操作是同步的,整个程序就会被“阻塞”,页面会卡住。
异步编程允许程序在等待一个耗时操作完成的同时,继续执行其他任务,当耗时操作完成后,再回来处理它。
Promise 和 async/await
Promise 是处理异步操作的现代方式,它代表了一个异步操作的最终完成(或失败)及其结果。async/await 是基于 Promise 的语法糖,让异步代码看起来更像同步代码,更易读。
-
Promise 基础
pending:进行中。
fulfilled:已成功。
rejected:已失败。
// 创建一个 Promise
let myPromise = new Promise(function(resolve, reject) {
// 模拟一个异步操作,比如网络请求
setTimeout(function() {
let success = true; // 模拟成功或失败
if (success) {
resolve("操作成功!"); // 成功时调用 resolve
} else {
reject("操作失败!"); // 失败时调用 reject
}
}, 2000); // 2秒后执行
});
// 使用 Promise
myPromise
.then(function(result) {
console.log(result); // 2秒后输出 "操作成功!"
})
.catch(function(error) {
console.log(error); // 如果失败,输出 "操作失败!"
});
-
async/await (推荐)
你需要在函数前加上 async 关键字,然后在 Promise 前加上 await 关键字。
async function fetchData() {
try {
console.log("开始获取数据...");
// await 会暂停函数执行,直到 Promise 完成
let result = await myPromise;
console.log("获取到的数据:", result);
} catch (error) {
console.log("发生错误:", error);
}
}
fetchData();
Fetch API
fetch 是现代浏览器提供的用于网络请求的 API,它返回一个 Promise。
示例:从公共 API 获取数据并显示在页面上。
-
HTML
<button id="getDataBtn">获取用户数据</button>
<div id="userList"></div>
-
JavaScript
const button = document.getElementById("getDataBtn");
const userList = document.getElementById("userList");
button.addEventListener("click", async () => {
try {
// 使用 fetch 发送 GET 请求
const response = await fetch('https://jsonplaceholder.typicode.com/users');
// 检查请求是否成功
if (!response.ok) {
throw new Error('网络响应不正常');
}
// 将响应体解析为 JSON
const users = await response.json();
// 清空之前的内容
userList.innerHTML = '';
// 遍历用户数据并显示
users.forEach(user => {
const userElement = document.createElement('p');
userElement.textContent = `${user.name} - ${user.email}`;
userList.appendChild(userElement);
});
} catch (error) {
console.error('获取数据时出错:', error);
userList.innerHTML = `<p style="color: red;">获取数据失败: ${error.message}</p>`;
}
});
第八部分:进阶概念
ES6+ 新特性简介
现代 JavaScript (ECMAScript 6 及以后版本) 引入了许多强大的新特性。
- 模板字符串:使用反引号
`,可以方便地嵌入变量。let name = "小明";
let greeting = `你好, ${name}!`; // 比拼接字符串更优雅
- 箭头函数:更简洁的函数语法。
const add = (a, b) => a + b;
- 解构赋值:从数组或对象中快速提取值。
// 数组解构
let [a, b] = [1, 2];
// 对象解构
let {name, age} = {name: "小红", age: 25};
- 类 (Class):基于原型的面向对象编程的语法糖。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} 发出声音,`);
}
}
let dog = new Animal("旺财");
dog.speak();
错误处理 (try...catch)
当代码中可能出现错误时,可以使用 try...catch 来捕获并处理它,而不是让整个程序崩溃。
try {
// 尝试执行可能出错的代码
let result = riskyOperation();
console.log(result);
} catch (error) {
// 如果出错,执行这里的代码
console.error("发生了一个错误:", error.message);
} finally {
// 无论是否出错,都会执行这里的代码
console.log("清理工作...");
}
模块化
随着项目变大,将所有代码写在一个文件中会变得混乱,模块化允许你将代码分割成独立的、可重用的文件。
- 导出 (
export):在一个文件中,使用 export 关键字将函数、变量或类暴露给其他文件。
math.jsexport const add = (a, b) => a + b;
export const PI = 3.14;
- 导入 (
import):在另一个文件中,使用 import 关键字引入其他模块的导出内容。
app.jsimport { add, PI } from './math.js';
console.log(add(2, 3)); // 5
console.log(PI); // 3.14
- 注意:要在 HTML 中使用模块,需要给
<script> 标签添加 type="module" 属性。<script type="module" src="app.js"></script>
第九部分:学习路径与资源推荐
学习路线图
- 打牢基础:精通本教程中的所有基础语法(变量、类型、函数、对象、数组、循环、条件)。
- DOM 操作:熟练使用 DOM API 来创建交互式网页,这是前端开发的核心技能。
- 异步编程:深入理解
Promise 和 async/await,并熟练使用 Fetch API 进行数据请求。
- 学习一个框架:当基础扎实后,选择一个主流前端框架进行学习,如 React, Vue, 或 Angular,它们能帮你构建大型、复杂的应用。
- 工具链:学习使用构建工具(如 Webpack, Vite)和包管理器(如 npm, yarn)。
- 持续学习:关注社区动态,学习新的标准和最佳实践。
推荐教程与文档
-
MDN Web Docs (Mozilla Developer Network)
- 链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
- 特点:最权威、最全面的 JavaScript 和 Web 技术文档,是每个开发者的必备手册,从入门到精通,应有尽有。
-
JavaScript.info
- 链接:https://zh.javascript.info/
- 特点:现代、深入、互动式的 JavaScript 教程,内容组织得非常好,从基础到高级概念都讲解得非常透彻。
-
freeCodeCamp
- 链接:https://www.freecodecamp.org/chinese/learn/2025/responsive-web-design/
- 特点:完全免费,通过项目驱动的方式学习,课程质量很高,非常适合零基础入门。
-
Codecademy
- 链接:https://www.codecademy.com/learn/introduction-to-javascript
- 特点:交互式学习体验,边学边练,对初学者非常友好。
-
YouTube 频道
- Traversy Media:高质量的 Web 开发教程,内容实用。
- The Net Ninja:系列教程非常完整,讲解清晰。
- Fireship:短视频,快速了解前沿技术和核心概念。
也是最重要的建议:多写代码! 不要只看不练,尝试用 JavaScript 做一些小项目,比如待办事项列表、简单的计算器、天气应用等,在实践中遇到问题,然后去解决它,这是学习编程最快的方式,祝你学习顺利!
在 HTML 文件中引入 JavaScript 代码有两种主要方式:
-
内部脚本:直接在 HTML 文件中编写。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的第一个 JS</title> </head> <body> <h1>你好,世界!</h1> <!-- 在这里写 JS 代码 --> <script> // 这里的代码会在页面加载时执行 alert("欢迎来到 JavaScript 世界!"); </script> </body> </html> -
外部脚本(推荐):将代码写入一个
.js文件,然后在 HTML 中引用。- 创建
script.js文件:// script.js alert("这是来自外部文件的问候!"); - 在 HTML 中引用:
<script src="script.js"></script>
注意:
<script>标签通常放在<body>的末尾,这样可以确保在脚本执行前,页面的 HTML 元素已经完全加载。
- 创建
变量
变量是存储数据值的容器,ES6 推荐使用 let 和 const。
let:用于声明可以重新赋值的变量。let message = "你好"; message = "你好,世界!"; // 可以重新赋值
const:用于声明常量,一旦赋值就不能再改变。const PI = 3.14159; // PI = 4; // 这会报错
var:旧的声明方式,存在一些问题(如函数作用域和变量提升),不推荐在新的项目中使用。
数据类型
JavaScript 是一种动态类型语言,变量的类型可以在运行时改变。
- 字符串:文本,用单引号或双引号括起来。
let name = "张三"; let greeting = '你好';
- 数字:整数或浮点数。
let age = 25; let price = 99.99;
- 布尔值:
true或false,通常用于条件判断。let isStudent = true; let isWorking = false;
- 未定义:
undefined,表示变量已声明但未赋值。let x; console.log(x); // 输出 undefined
- 空值:
null,表示“空值”或“无值”。let data = null;
- 对象:复杂数据类型,用于存储键值对集合。
let person = { name: "李四", age: 30 }; - 数组:用于存储有序的值列表。
let colors = ["红色", "绿色", "蓝色"];
注释
注释是代码中不被执行的说明,用于解释代码。
- 单行注释:
// 这是一个单行注释 let a = 1;
- 多行注释:
/* 这是一个 多行注释 */ let b = 2;
运算符
- 算术运算符:, , , , (取余)
console.log(10 + 5); // 15 console.log(10 % 3); // 1
- 赋值运算符:, , , etc.
let x = 10; x += 5; // 等同于 x = x + 5; x 现在是 15
- 比较运算符:, , , ,
>,<,>=,<=- 值相等 (会进行类型转换)
- 值和类型都相等 (推荐使用)
console.log(5 == "5"); // true console.log(5 === "5"); // false
- 逻辑运算符:
&&(与), (或), (非)let sunny = true; let warm = false; console.log(sunny && warm); // false ( console.log(sunny || warm); // true (或者) console.log(!sunny); // false (非)
条件语句
根据不同的条件执行不同的代码。
if...elselet hour = 20; if (hour < 12) { console.log("早上好!"); } else if (hour < 18) { console.log("下午好!"); } else { console.log("晚上好!"); }switchlet day = "Monday"; switch (day) { case "Monday": console.log("新的一周开始了。"); break; case "Friday": console.log("周末快到了!"); break; default: console.log("普通的一天。"); }
循环语句
重复执行一段代码。
for循环:在循环次数已知时使用。// 打印 0 到 4 for (let i = 0; i < 5; i++) { console.log(i); }while循环:在条件为true时持续循环。let count = 0; while (count < 5) { console.log(count); count++; // 别忘了增加计数器,否则会无限循环 }
第四部分:函数
函数是可以重复使用的代码块,用于执行特定的任务。
函数声明与表达式
-
函数声明
function greet(name) { return "你好, " + name + "!"; } -
函数表达式 (更常见,特别是箭头函数)
const greet = function(name) { return "你好, " + name + "!"; }; // ES6 箭头函数 - 更简洁 const greetArrow = (name) => { return `你好, ${name}!`; // 使用模板字符串 }; // 如果函数体只有一行返回值,可以更简化 const greetSimple = (name) => `你好, ${name}!`;
参数与返回值
- 参数:函数的输入,在函数名后的括号中定义。
- 返回值:函数的输出,使用
return关键字返回,函数执行到return语句后会立即停止。
function add(a, b) {
return a + b; // 返回 a 和 b 的和
}
let sum = add(5, 3);
console.log(sum); // 输出 8
作用域
作用域决定了变量和函数的可访问性。
-
全局作用域:在任何地方都可以访问。
-
函数作用域:在函数内部定义的变量,只能在函数内部访问。
let globalVar = "我是全局变量"; function myFunction() { let functionVar = "我是函数变量"; console.log(globalVar); // 可以访问 console.log(functionVar); // 可以访问 } console.log(globalVar); // 可以访问 // console.log(functionVar); // 报错!无法访问
第五部分:对象与数组
对象
对象是键值对的集合,用于存储更复杂的数据。
-
创建对象
let car = { brand: "Toyota", model: "Camry", year: 2025, start: function() { console.log("引擎启动!"); } }; -
访问属性和方法
console.log(car.brand); // 使用点表示法 console.log(car["model"]); // 使用方括号表示法(适用于属性名有空格或变量时) car.start(); // 调用方法
-
修改属性
car.year = 2025; console.log(car.year); // 2025
数组
数组用于存储有序的值列表。
- 创建数组
let fruits = ["苹果", "香蕉", "橙子"]; let numbers = [1, 2, 3, 4, 5];
- 访问元素
console.log(fruits[0]); // 索引从 0 开始,输出 "苹果"
- 修改元素
fruits[1] = "葡萄"; console.log(fruits); // ["苹果", "葡萄", "橙子"]
常用方法
- 数组方法
push():在数组末尾添加一个或多个元素。pop():删除并返回数组的最后一个元素。shift():删除并返回数组的第一个元素。unshift():在数组开头添加一个或多个元素。length:获取数组的长度。let colors = ["红", "绿"]; colors.push("蓝"); // colors 现在是 ["红", "绿", "蓝"] colors.pop(); // 返回 "蓝", colors 现在是 ["红", "绿"]
- 对象方法
Object.keys():获取对象的所有键。Object.values():获取对象的所有值。let user = { name: "王五", age: 28 }; console.log(Object.keys(user)); // ["name", "age"] console.log(Object.values(user)); // ["王五", 28]
第六部分:DOM 操作 - 让网页“活”起来
DOM (Document Object Model) 是 HTML 和 XML 文档的编程接口,它将文档表示为一个树形结构,JavaScript 可以通过 DOM 来访问和修改文档的内容、结构和样式。
什么是 DOM?
当浏览器加载一个 HTML 页面时,它会将其转换成一个“文档对象模型”(DOM树),JavaScript 可以通过这个树来“触摸”和“操控”HTML 元素。
选择元素
在操作元素之前,首先要选中它。
getElementById():通过 ID 选择。<p id="intro">这是一个介绍。</p>
let introElement = document.getElementById("intro");querySelector():通过 CSS 选择器(最常用、最强大)。<p class="text">这是一段文本。</p> <ul> <li>项目1</li> <li>项目2</li> </ul>let firstText = document.querySelector(".text"); // 选择 class 为 "text" 的第一个元素 let firstLi = document.querySelector("ul li"); // 选择 ul 下的第一个 liquerySelectorAll():选择所有匹配的元素,返回一个 NodeList(类数组)。let allLis = document.querySelectorAll("li"); // 选择所有的 li
与样式
element.textContent:获取或设置元素的文本内容(不解析 HTML 标签)。element.innerHTML:获取或设置元素的 HTML 内容(会解析 HTML 标签)。let intro = document.getElementById("intro"); intro.textContent = "文本内容已更新!"; intro.innerHTML = "<strong>HTML 内容已更新!</strong>";
- 修改样式
element.style.property:修改内联样式。let intro = document.getElementById("intro"); intro.style.color = "blue"; intro.style.fontSize = "20px";
处理事件
事件是用户或浏览器执行的某种动作,如点击、鼠标悬停、键盘按下等,我们可以让 JavaScript 监听这些事件并做出响应。
-
添加事件监听器
<button id="myButton">点击我</button> <p id="message"></p>
let button = document.getElementById("myButton"); let message = document.getElementById("message"); button.addEventListener("click", function() { message.textContent = "按钮被点击了!"; message.style.color = "green"; });常见事件:
click,mouseover,mouseout,keydown,load等。
第七部分:异步编程与 API
什么是异步?
在 JavaScript 中,代码通常是同步执行的,即一行一行地按顺序执行,但有些操作(如网络请求、读取文件)可能需要很长时间,如果这些操作是同步的,整个程序就会被“阻塞”,页面会卡住。
异步编程允许程序在等待一个耗时操作完成的同时,继续执行其他任务,当耗时操作完成后,再回来处理它。
Promise 和 async/await
Promise 是处理异步操作的现代方式,它代表了一个异步操作的最终完成(或失败)及其结果。async/await 是基于 Promise 的语法糖,让异步代码看起来更像同步代码,更易读。
-
Promise基础pending:进行中。fulfilled:已成功。rejected:已失败。// 创建一个 Promise let myPromise = new Promise(function(resolve, reject) { // 模拟一个异步操作,比如网络请求 setTimeout(function() { let success = true; // 模拟成功或失败 if (success) { resolve("操作成功!"); // 成功时调用 resolve } else { reject("操作失败!"); // 失败时调用 reject } }, 2000); // 2秒后执行 });
// 使用 Promise myPromise .then(function(result) { console.log(result); // 2秒后输出 "操作成功!" }) .catch(function(error) { console.log(error); // 如果失败,输出 "操作失败!" });
-
async/await(推荐) 你需要在函数前加上async关键字,然后在 Promise 前加上await关键字。async function fetchData() { try { console.log("开始获取数据..."); // await 会暂停函数执行,直到 Promise 完成 let result = await myPromise; console.log("获取到的数据:", result); } catch (error) { console.log("发生错误:", error); } } fetchData();
Fetch API
fetch 是现代浏览器提供的用于网络请求的 API,它返回一个 Promise。
示例:从公共 API 获取数据并显示在页面上。
-
HTML
<button id="getDataBtn">获取用户数据</button> <div id="userList"></div>
-
JavaScript
const button = document.getElementById("getDataBtn"); const userList = document.getElementById("userList"); button.addEventListener("click", async () => { try { // 使用 fetch 发送 GET 请求 const response = await fetch('https://jsonplaceholder.typicode.com/users'); // 检查请求是否成功 if (!response.ok) { throw new Error('网络响应不正常'); } // 将响应体解析为 JSON const users = await response.json(); // 清空之前的内容 userList.innerHTML = ''; // 遍历用户数据并显示 users.forEach(user => { const userElement = document.createElement('p'); userElement.textContent = `${user.name} - ${user.email}`; userList.appendChild(userElement); }); } catch (error) { console.error('获取数据时出错:', error); userList.innerHTML = `<p style="color: red;">获取数据失败: ${error.message}</p>`; } });
第八部分:进阶概念
ES6+ 新特性简介
现代 JavaScript (ECMAScript 6 及以后版本) 引入了许多强大的新特性。
- 模板字符串:使用反引号
`,可以方便地嵌入变量。let name = "小明"; let greeting = `你好, ${name}!`; // 比拼接字符串更优雅 - 箭头函数:更简洁的函数语法。
const add = (a, b) => a + b;
- 解构赋值:从数组或对象中快速提取值。
// 数组解构 let [a, b] = [1, 2]; // 对象解构 let {name, age} = {name: "小红", age: 25}; - 类 (Class):基于原型的面向对象编程的语法糖。
class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} 发出声音,`); } } let dog = new Animal("旺财"); dog.speak();
错误处理 (try...catch)
当代码中可能出现错误时,可以使用 try...catch 来捕获并处理它,而不是让整个程序崩溃。
try {
// 尝试执行可能出错的代码
let result = riskyOperation();
console.log(result);
} catch (error) {
// 如果出错,执行这里的代码
console.error("发生了一个错误:", error.message);
} finally {
// 无论是否出错,都会执行这里的代码
console.log("清理工作...");
}
模块化
随着项目变大,将所有代码写在一个文件中会变得混乱,模块化允许你将代码分割成独立的、可重用的文件。
- 导出 (
export):在一个文件中,使用export关键字将函数、变量或类暴露给其他文件。math.jsexport const add = (a, b) => a + b; export const PI = 3.14;
- 导入 (
import):在另一个文件中,使用import关键字引入其他模块的导出内容。app.jsimport { add, PI } from './math.js'; console.log(add(2, 3)); // 5 console.log(PI); // 3.14- 注意:要在 HTML 中使用模块,需要给
<script>标签添加type="module"属性。<script type="module" src="app.js"></script>
第九部分:学习路径与资源推荐
学习路线图
- 打牢基础:精通本教程中的所有基础语法(变量、类型、函数、对象、数组、循环、条件)。
- DOM 操作:熟练使用 DOM API 来创建交互式网页,这是前端开发的核心技能。
- 异步编程:深入理解
Promise和async/await,并熟练使用FetchAPI 进行数据请求。 - 学习一个框架:当基础扎实后,选择一个主流前端框架进行学习,如 React, Vue, 或 Angular,它们能帮你构建大型、复杂的应用。
- 工具链:学习使用构建工具(如 Webpack, Vite)和包管理器(如 npm, yarn)。
- 持续学习:关注社区动态,学习新的标准和最佳实践。
推荐教程与文档
-
MDN Web Docs (Mozilla Developer Network)
- 链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
- 特点:最权威、最全面的 JavaScript 和 Web 技术文档,是每个开发者的必备手册,从入门到精通,应有尽有。
-
JavaScript.info
- 链接:https://zh.javascript.info/
- 特点:现代、深入、互动式的 JavaScript 教程,内容组织得非常好,从基础到高级概念都讲解得非常透彻。
-
freeCodeCamp
- 链接:https://www.freecodecamp.org/chinese/learn/2025/responsive-web-design/
- 特点:完全免费,通过项目驱动的方式学习,课程质量很高,非常适合零基础入门。
-
Codecademy
- 链接:https://www.codecademy.com/learn/introduction-to-javascript
- 特点:交互式学习体验,边学边练,对初学者非常友好。
-
YouTube 频道
- Traversy Media:高质量的 Web 开发教程,内容实用。
- The Net Ninja:系列教程非常完整,讲解清晰。
- Fireship:短视频,快速了解前沿技术和核心概念。
也是最重要的建议:多写代码! 不要只看不练,尝试用 JavaScript 做一些小项目,比如待办事项列表、简单的计算器、天气应用等,在实践中遇到问题,然后去解决它,这是学习编程最快的方式,祝你学习顺利!
