跳转至

JavaScript 教程

什么是 JavaScript?

JavaScript 是网页的编程语言,让网页具有交互功能。它与 HTML(结构)、CSS(样式)并称 Web 三大核心技术。

JavaScript 可以在浏览器中运行(前端),也可以在服务器上运行(Node.js)。


基本语法

变量声明

// var(旧,不推荐)
var name = "小明";

// let(推荐):可重新赋值
let age = 18;
age = 19;

// const(推荐):不可重新赋值
const PI = 3.14159;
声明方式 作用域 可修改 提升
var 函数作用域 会提升
let 块级作用域 暂存死区
const 块级作用域 不可 暂存死区

数据类型

// 基本类型
let num = 42;           // 数字(整数 + 浮点数)
let str = "字符串";      // 字符串(单引号/双引号/反引号)
let bool = true;        // 布尔值(true/false)
let undef = undefined;  // 未定义
let n = null;           // 空值
let sym = Symbol();     // 唯一标识符
let big = 123n;         // 大整数

// 引用类型
let arr = [1, 2, 3];                    // 数组
let obj = { name: "小明", age: 18 };    // 对象

类型转换

// 字符串 → 数字
Number("42");       // 42
parseInt("42px");   // 42
+"42";              // 42

// 数字 → 字符串
String(42);         // "42"
(42).toString();    // "42"
`${42}`;            // "42"

运算符

// 算术:+ - * / % **(幂)
// 比较:== === != !== > < >= <=
// 逻辑:&& || !
// 赋值:= += -= *= /=
// 三元:condition ? value1 : value2

// 严格相等 vs 抽象相等
0 == false   // true(类型转换后相等)
0 === false  // false(类型不同)

控制流

// if 语句
if (age >= 18) {
    console.log("成年人");
} else if (age >= 6) {
    console.log("未成年人");
} else {
    console.log("儿童");
}

// switch 语句
switch (day) {
    case 1: console.log("周一"); break;
    case 2: console.log("周二"); break;
    default: console.log("其他");
}

// 循环
for (let i = 0; i < 5; i++) {
    console.log(i);
}

let arr = [10, 20, 30];
for (let item of arr) {
    console.log(item);
}

let obj = {a: 1, b: 2};
for (let key in obj) {
    console.log(key, obj[key]);
}

let i = 0;
while (i < 5) {
    console.log(i);
    i++;
}

函数

函数声明

// 传统函数
function add(a, b) {
    return a + b;
}

// 函数表达式
const multiply = function(a, b) {
    return a * b;
};

// 箭头函数(ES6)
const subtract = (a, b) => a - b;

// 默认参数
function greet(name = "游客") {
    return `你好,${name}!`;
}

// 剩余参数
function sum(...numbers) {
    return numbers.reduce((acc, n) => acc + n, 0);
}

高阶函数

const numbers = [1, 2, 3, 4, 5];

// map:映射
const doubled = numbers.map(n => n * 2);  // [2, 4, 6, 8, 10]

// filter:过滤
const evens = numbers.filter(n => n % 2 === 0);  // [2, 4]

// reduce:归约
const sumAll = numbers.reduce((acc, n) => acc + n, 0);  // 15

// forEach:遍历
numbers.forEach(n => console.log(n));

对象与数组

对象操作

const person = {
    name: "小明",
    age: 18,
    greet() {  // 方法简写
        console.log(`你好,我是${this.name}`);
    }
};

// 访问属性
person.name;           // "小明"
person["name"];        // "小明"

// 增删改
person.height = 175;   // 新增
delete person.age;     // 删除
person.name = "小红";  // 修改

// 解构赋值
const { name, age } = person;

数组操作

const arr = [1, 2, 3];

arr.push(4);          // 末尾添加:[1,2,3,4]
arr.pop();            // 移除末尾:[1,2,3]
arr.unshift(0);       // 开头添加:[0,1,2,3]
arr.shift();          // 移除开头:[1,2,3]
arr.slice(1, 3);      // 截取:[2,3]
arr.splice(1, 1);     // 删除索引1处的元素
arr.indexOf(2);       // 查找索引:1
arr.includes(3);      // 是否包含:true
arr.join("-");        // 连接字符串:"1-2-3"

// 展开运算符
const arr1 = [1, 2];
const arr2 = [3, 4];
const combined = [...arr1, ...arr2];  // [1,2,3,4]

DOM 操作

DOM(Document Object Model)是 HTML 文档的编程接口,通过 JavaScript 可以动态修改页面内容。

获取元素

// 单个元素
const title = document.querySelector("#title");
const firstBtn = document.querySelector(".btn");

// 多个元素(NodeList)
const buttons = document.querySelectorAll(".btn");
const divs = document.getElementsByTagName("div");

修改内容与样式

// 修改文本
title.textContent = "新标题";
title.innerHTML = "<em>新标题</em>";

// 修改样式
title.style.color = "red";
title.style.fontSize = "24px";  // CSS属性用驼峰命名

// 操作类名
title.classList.add("active");
title.classList.remove("hidden");
title.classList.toggle("visible");
title.classList.contains("active");  // true/false

// 修改属性
const link = document.querySelector("a");
link.href = "https://example.com";
link.setAttribute("target", "_blank");
link.getAttribute("href");

创建和删除元素

// 创建元素
const newDiv = document.createElement("div");
newDiv.textContent = "新创建的元素";
newDiv.classList.add("box");

// 插入
document.body.appendChild(newDiv);
parent.insertBefore(newDiv, referenceNode);
parent.append(newDiv);        // 更现代的方式
parent.prepend(newDiv);       // 插入到开头

// 删除
newDiv.remove();              // 直接删除
parent.removeChild(newDiv);   // 通过父元素删除

事件处理

事件监听

const btn = document.querySelector("button");

// 方式一:addEventListener(推荐)
btn.addEventListener("click", function(event) {
    console.log("按钮被点击了!");
    console.log(event.target);  // 触发事件的元素
});

// 方式二:onclick(一次只能绑定一个)
btn.onclick = function() {
    console.log("点击!");
};

常用事件

事件 触发条件
click 鼠标点击
dblclick 鼠标双击
mouseover 鼠标移入
mouseout 鼠标移出
keydown 键盘按下
keyup 键盘释放
submit 表单提交
change 值改变
input 输入中
scroll 滚动
load 页面加载完成

事件对象

document.addEventListener("click", function(event) {
    event.preventDefault();    // 阻止默认行为(如链接跳转)
    event.stopPropagation();   // 阻止事件冒泡
    console.log(event.clientX, event.clientY);  // 鼠标坐标
});

事件委托

利用事件冒泡,在父元素上统一处理子元素的事件:

document.querySelector("ul").addEventListener("click", function(event) {
    if (event.target.tagName === "LI") {
        console.log("列表项被点击:", event.target.textContent);
    }
});

ES6+ 特性

模板字符串

const name = "小明";
const age = 18;
console.log(`你好,我叫${name},今年${age}岁`);

// 多行字符串
const html = `
    <div>
        <h1>${name}</h1>
        <p>年龄:${age}</p>
    </div>
`;

解构赋值

// 数组解构
const [x, y, z] = [1, 2, 3];
const [first, ...rest] = [1, 2, 3, 4];  // first=1, rest=[2,3,4]

// 对象解构
const { name, age, city = "北京" } = person;
const { name: userName } = person;  // 重命名

箭头函数

// 简化函数写法
const add = (a, b) => a + b;
const square = x => x * x;
const noParam = () => console.log("无参数");

// 注意:箭头函数没有自己的 this
const obj = {
    name: "obj",
    regular: function() { console.log(this.name); },  // this → obj
    arrow: () => { console.log(this.name); }           // this → 外层
};

Promise 与异步

// Promise
const fetchData = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("数据加载完成");
        }, 1000);
    });
};

fetchData()
    .then(data => console.log(data))
    .catch(error => console.error(error));

// async/await(更简洁)
async function loadData() {
    try {
        const result = await fetchData();
        console.log(result);
    } catch (error) {
        console.error("加载失败", error);
    }
}

// Fetch API(网络请求)
async function getUsers() {
    const response = await fetch("https://api.example.com/users");
    const data = await response.json();
    console.log(data);
}

模块化

// math.js - 导出
export function add(a, b) { return a + b; }
export const PI = 3.14;
export default class Calculator { ... }

// main.js - 导入
import Calculator, { add, PI } from "./math.js";

综合练习

动手实践

实现一个待办事项列表(Todo List): 1. 输入框输入任务文字 2. 点击"添加"按钮添加到列表中 3. 点击列表项标记为已完成(添加删除线样式) 4. 点击"删除"按钮移除任务 5. 显示未完成的任务数量


学习建议

  1. 在浏览器控制台练习:按 F12 打开开发者工具,在 Console 面板练习
  2. 多看 MDN 文档MDN JavaScript 指南
  3. 动手做项目:从小项目开始(计算器、时钟、Todo List)
  4. 学习调试:使用 console.log()、断点调试等工具