当你的网页...
点击按钮毫无反应?
表单提交原地发呆?
页面内容死气沉沉?
别怀疑——它缺少了 JavaScript 这个"灵魂"!👻
一、JavaScript:网页的"神经系统" 🧠
诞生传奇:1995年网景工程师Brendan Eich仅用 10天 创造出JavaScript(原名Mocha)
核心使命:让静态网页变身动态应用
三大超能力:
-
DOM操控:实时修改页面内容
-
事件响应:处理用户交互
-
异步通信:后台获取数据(AJAX)
<!-- JS在HTML中的位置 -->
<!DOCTYPE html>
<html>
<head>
<script>
// 头部脚本:谨慎使用!会阻塞页面渲染
console.log("头部JS执行");
</script>
</head>
<body>
<!-- 推荐位置:body结束前 -->
<script src="app.js"></script> <!-- 外部脚本 -->
<script>
// 内部脚本
document.getElementById("btn").onclick = function() {
alert("按钮被点击!");
}
</script>
</body>
</html>
二、变量:数据的"存储容器" 📦
1. 声明变量三剑客
// var (老将,有缺陷)
var age = 18; // 函数作用域,会被提升(hoisting)
// let (新星,推荐)
let userName = "小明"; // 块级作用域
// const (常量卫士)
const PI = 3.14159; // 不可重新赋值
2. 命名规范黄金法则
// 正确示范
let studentCount = 30; // 驼峰命名
const MAX_SIZE = 100; // 常量全大写
// 错误示范
let 1stPlace = "张三"; // 数字开头 ❌
let function = "关键词"; // 保留字 ❌
冷知识:JavaScript最初变量名长度限制为 255字符(1995年)!
三、数据类型:JS的"元素周期表" 🔬
原始类型(栈内存存储)
类型 | 示例 | 特性 |
---|---|---|
Number | 42 , 3.14 | 所有数字都是浮点数 |
String | "hello" | 不可变文本 |
Boolean | true/false | 逻辑判断 |
Undefined | undefined | 未赋值的默认值 |
Null | null | 空值对象 |
BigInt | 100n | 大整数(ES2020) |
Symbol | Symbol() | 唯一标识符(ES6) |
引用类型(堆内存存储)
// 对象 - 存储键值对
let student = {
name: "李雷",
age: 20,
courses: ["数学", "英语"]
};
// 数组 - 有序集合
let fruits = ["苹果", "香蕉", "橙子"];
// 函数 - 可执行代码块
function greet(name) {
return `你好, ${name}!`;
}
类型检测神技:
typeof 42; // "number"
typeof []; // "object" (历史遗留问题!)
Array.isArray([]); // true (推荐方法)
四、运算符:JS的"数学魔法" ✨
1. 算术运算符
let x = 10;
x + 5; // 15 (加法)
x - 3; // 7 (减法)
x * 2; // 20 (乘法)
x / 4; // 2.5 (除法)
x % 3; // 1 (取模)
x ** 2; // 100 (指数)
2. 比较运算符
10 > 5; // true
10 <= 10; // true
"5" == 5; // true (值相等)
"5" === 5; // false (类型不同!)
3. 逻辑运算符
// && (逻辑与)
isStudent && hasIDCard;
// || (逻辑或)
isTeacher || isAdmin;
// ! (逻辑非)
!isBanned;
五、条件语句:决策的"十字路口" 🛣️
// if-else 基础结构
let score = 85;
if (score >= 90) {
console.log("优秀");
} else if (score >= 60) {
console.log("及格");
} else {
console.log("不及格");
}
// switch 多分支选择
let day = "Monday";
switch(day) {
case "Monday":
console.log("工作日开始");
break; // 必须break!
case "Friday":
console.log("周末快乐");
break;
default:
console.log("普通工作日");
}
新手陷阱:忘记break
会导致"贯穿"执行!
六、循环语句:重复的"时间魔法" ⏳
1. for
循环(精确控制)
// 打印1-5
for (let i = 1; i <= 5; i++) {
console.log(i);
}
2. while
循环(条件优先)
// 猜数字游戏
let guess;
while (guess !== 7) {
guess = prompt("猜数字(1-10)");
}
console.log("猜对了!");
3. for...of
循环(遍历数组)
let fruits = ["苹果", "香蕉", "橙子"];
for (let fruit of fruits) {
console.log(fruit);
}
性能核弹:避免在循环内操作DOM!会导致多次重绘
七、函数:代码的"可复用魔咒" 📜
// 函数声明
function calculateArea(width, height) {
return width * height;
}
// 函数表达式
const greet = function(name) {
return `你好, ${name}!`;
};
// 箭头函数 (ES6+)
const add = (a, b) => a + b;
参数默认值:
function createUser(name, role = "user") {
console.log(`${name} - ${role}`);
}
createUser("小明"); // "小明 - user"
八、DOM基础:网页的"遥控器" 🎮
// 获取元素
const btn = document.getElementById("myBtn");
// 修改内容
btn.textContent = "点击我!";
// 添加事件
btn.addEventListener("click", function() {
this.style.backgroundColor = "blue";
});
// 创建新元素
const newDiv = document.createElement("div");
newDiv.innerHTML = "<p>新内容</p>";
document.body.appendChild(newDiv);
安全警报:避免使用innerHTML
插入用户输入,防止XSS攻击!
九、避坑指南:JS新手的"九大天坑" 🕳️
坑1:变量提升(Hoisting)
console.log(x); // undefined (不会报错!)
var x = 5;
// 解决:使用let/const
坑2:隐式类型转换
1 + "1" // "11" (数字变字符串)
"5" - 3 // 2 (字符串变数字)
// 解决:显式转换 Number("1")
坑3:循环闭包问题
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 输出3次3!
}
// 解决:改用let或闭包
十、未来展望:JavaScript的"进化之路" 🚀
-
ES6革命:2015年重大更新(let/const/箭头函数)
-
模块化:ES6 Modules成为标准
-
异步进化:Promise -> Async/Await
-
类型扩展:TypeScript席卷生态
-
全栈化:Node.js让JS统治前后端
动手实验室:创建你的第一个JS程序 🧪
-
时间显示器
在页面上实时显示当前时间(HH:MM:SS格式) -
简易计算器
实现加减乘除功能 -
随机名言生成器
点击按钮随机显示一条励志名言
// 时间显示器示例
function showTime() {
const now = new Date();
document.getElementById("clock").textContent =
now.toLocaleTimeString();
}
setInterval(showTime, 1000); // 每秒更新
今日挑战:在评论区用JS输出你的"编程座右铭",抽3人送《JavaScript悟道》实体书!