JavaScript 介绍与历史:赋予网页生命的编程语言
什么是 JavaScript?
JavaScript 是一种高级的、解释型的编程语言,它为网页添加了交互性和动态功能。如果说 HTML 是网页的骨架,CSS 是网页的外貌,那么 JavaScript 就是网页的灵魂,它让静态的网页"活"起来。
想象一下制作一个机器人:
- HTML 构建了机器人的身体结构
- CSS 设计了机器人的外观造型
- JavaScript 编写了机器人的行为和思维
// JavaScript 让网页具有交互能力
function showGreeting() {
const currentTime = new Date();
const hour = currentTime.getHours();
let greeting;
if (hour < 12) {
greeting = "早上好!";
} else if (hour < 18) {
greeting = "下午好!";
} else {
greeting = "晚上好!";
}
// 动态修改网页内容
document.getElementById("greeting").textContent = greeting;
}
// 页面加载完成后执行
document.addEventListener("DOMContentLoaded", showGreeting);JavaScript 的核心特点
1. 解释型语言
JavaScript 代码不需要预先编译,而是由浏览器或 Node.js 运行时即时解释执行:
// 这段代码会立即执行,无需编译
let message = "Hello, JavaScript!";
console.log(message); // 输出: Hello, JavaScript!
// 动态执行代码
const code = "let x = 10; let y = 20; console.log(x + y);";
eval(code); // 输出: 302. 动态类型系统
JavaScript 的变量类型是动态的,可以在运行时改变:
// 动态类型示例
let data = "Hello"; // data 是字符串
console.log(typeof data); // 输出: string
data = 42; // data 现在是数字
console.log(typeof data); // 输出: number
data = [1, 2, 3]; // data 现在是数组
console.log(typeof data); // 输出: object
console.log(Array.isArray(data)); // 输出: true3. 基于原型的面向对象
JavaScript 使用原型继承而不是传统的类继承(ES6 引入了 class 语法糖):
// 传统基于原型的对象创建
function Person(name, age) {
this.name = name;
this.age = age;
}
// 在原型上定义方法
Person.prototype.greet = function () {
return `你好,我是 ${this.name},今年 ${this.age} 岁。`;
};
const person = new Person("张三", 25);
console.log(person.greet()); // 输出: 你好,我是 张三,今年 25 岁。
// ES6 class 语法(本质仍是原型)
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} 发出了声音!`;
}
}
class Dog extends Animal {
speak() {
return `${this.name} 汪汪叫!`;
}
}
const dog = new Dog("旺财");
console.log(dog.speak()); // 输出: 旺财 汪汪叫!4. 事件驱动编程
JavaScript 特别适合处理用户交互事件:
// 事件驱动编程示例
const button = document.getElementById("myButton");
// 多种事件监听方式
button.addEventListener("click", function (event) {
console.log("按钮被点击了!", event);
});
button.addEventListener("mouseover", function () {
this.style.backgroundColor = "lightblue";
});
button.addEventListener("mouseout", function () {
this.style.backgroundColor = "";
});
// 事件委托 - 高效处理多个元素的事件
document.getElementById("list").addEventListener("click", function (e) {
if (e.target.tagName === "LI") {
console.log("点击了列表项:", e.target.textContent);
}
});JavaScript 的诞生故事
互联网的早期困境(1990 年代初)
在 Web 的早期,网页完全是静态的。用户只能查看信息,无法与之交互。这种体验就像看电视节目,只能被动接收,无法参与。
当时的问题:
- 网页只能在服务器端处理逻辑
- 用户输入需要提交到服务器才能处理
- 缺乏实时反馈和动态效果
- 用户体验单调乏味
布兰登·艾克的创造(1995)
1995 年,在 Netscape 公司工作的程序员布兰登·艾克(Brendan Eich)仅用了10 天时间就创建了 JavaScript 的最初版本。
创造的初衷:
// 最初的 JavaScript 设计理念
// 1. 让网页具有基本的交互能力
function validateForm() {
const name = document.forms["myForm"]["name"].value;
if (name === "") {
alert("姓名不能为空!");
return false;
}
}
// 2. 在不重新加载页面的情况下修改内容
function changeText() {
document.getElementById("demo").innerHTML = "内容已被修改!";
}
// 3. 响应用户的简单操作
function showMessage() {
alert("欢迎访问我的网站!");
}命名的故事
JavaScript 的命名充满了营销考量:
- 最初叫 Mocha(摩卡咖啡)
- 后来改为 LiveScript(强调动态性)
- 最终定名 JavaScript(借助 Java 的知名度)
重要澄清:JavaScript 和 Java 是完全不同的语言!
- Java:编译型语言,需要预先编译
- JavaScript:解释型语言,即时执行
- 两者只是语法有些相似,但设计理念完全不同
标准化进程(1997-至今)
ECMAScript 标准的诞生
为了避免不同浏览器实现不一致的问题,JavaScript 开始标准化:
主要版本里程碑:
// ECMAScript 3 (1999) - 成为事实标准
// 这是我们熟悉的经典 JavaScript 语法
var x = 10;
function hello(name) {
return "Hello, " + name;
}
if (x > 5) {
console.log("大于5");
}
// ECMAScript 5 (2009) - 严格模式和数组方法
("use strict"); // 严格模式
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map(function (n) {
return n * 2;
});
// ECMAScript 2015 (ES6) - 现代JavaScript的开端
// let/const、箭头函数、模板字符串等
let message = `Hello, ${name}!`;
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((n) => n * 2);JavaScript 的运行环境
浏览器环境
JavaScript 最初就是为浏览器设计的运行环境:
// 浏览器特有的对象和API
console.log(window); // 全局对象
console.log(document); // DOM操作
console.log(navigator); // 浏览器信息
console.log(localStorage); // 本地存储
console.log(sessionStorage); // 会话存储
// 定时器
setTimeout(() => {
console.log("1秒后执行");
}, 1000);
setInterval(() => {
console.log("每秒执行一次");
}, 1000);
// 网络请求
fetch("/api/data")
.then((response) => response.json())
.then((data) => console.log(data));Node.js 环境(2009 年)
Ryan Dahl 在 2009 年创建了 Node.js,将 JavaScript 带到了服务器端:
// Node.js 示例
const fs = require("fs"); // 文件系统
const http = require("http"); // HTTP服务器
const path = require("path"); // 路径处理
// 创建HTTP服务器
const server = http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/html" });
res.end("<h1>Hello, Node.js!</h1>");
});
server.listen(3000, () => {
console.log("服务器运行在 http://localhost:3000");
});
// 异步文件操作
fs.readFile("data.txt", "utf8", (err, data) => {
if (err) throw err;
console.log(data);
});现代 JavaScript 运行时
除了浏览器和 Node.js,现在还有更多 JavaScript 运行时:
// Deno - 现代化的 JavaScript/TypeScript 运行时
// 支持TypeScript开箱即用,更安全的权限控制
// Bun - 极快的 JavaScript 运行时
// 专注于性能优化和包管理
// Cloudflare Workers - 边缘计算环境
// 在全球边缘节点上运行 JavaScript 代码现代 JavaScript 特性
1. 模块系统
现代 JavaScript 支持模块化开发:
// math.js - 导出模块
export function add(a, b) {
return a + b;
}
export function multiply(a, b) {
return a * b;
}
export const PI = 3.14159;
// 默认导出
export default function calculator() {
return {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
};
}
// main.js - 导入模块
import calculator, { add, multiply, PI } from "./math.js";
import * as MathUtils from "./math.js";
console.log(add(5, 3)); // 输出: 8
console.log(multiply(4, 6)); // 输出: 24
console.log(PI); // 输出: 3.14159
const calc = calculator();
console.log(calc.add(10, 20)); // 输出: 302. 异步编程
JavaScript 提供了多种异步编程模式:
// 回调函数(传统方式)
function fetchData(callback) {
setTimeout(() => {
const data = { id: 1, name: "示例数据" };
callback(data);
}, 1000);
}
fetchData(function (data) {
console.log("回调方式:", data);
});
// Promise(现代方式)
function fetchUserData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({ id: 1, name: "张三" });
}, 1000);
});
}
fetchUserData()
.then((user) => console.log("Promise方式:", user))
.catch((error) => console.error("错误:", error));
// Async/Await(最新的异步语法)
async function getUserData() {
try {
const user = await fetchUserData();
const posts = await fetchUserPosts(user.id);
console.log("Async/Await方式:", user);
console.log("用户帖子:", posts);
return { user, posts };
} catch (error) {
console.error("获取数据失败:", error);
}
}
getUserData();3. 函数式编程
JavaScript 支持函数式编程范式:
// 高阶函数
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((n) => n * 2);
const evens = numbers.filter((n) => n % 2 === 0);
const sum = numbers.reduce((acc, n) => acc + n, 0);
console.log(doubled); // [2, 4, 6, 8, 10]
console.log(evens); // [2, 4]
console.log(sum); // 15
// 函数组合
const compose =
(...fns) =>
(x) =>
fns.reduceRight((acc, fn) => fn(acc), x);
const add5 = (x) => x + 5;
const multiply2 = (x) => x * 2;
const toString = (x) => `结果: ${x}`;
const calculate = compose(toString, multiply2, add5);
console.log(calculate(10)); // "结果: 30"
// 纯函数和不可变性
const user = { name: "张三", age: 25 };
// 不推荐:修改原对象
function impureUpdateAge(user) {
user.age += 1;
return user;
}
// 推荐:创建新对象
function pureUpdateAge(user) {
return { ...user, age: user.age + 1 };
}
const updatedUser = pureUpdateAge(user);
console.log(user); // { name: "张三", age: 25 }
console.log(updatedUser); // { name: "张三", age: 26 }4. 解构赋值和展开运算符
现代 JavaScript 提供了便利的数据处理语法:
// 数组解构
const fruits = ["apple", "banana", "orange"];
const [first, second, third] = fruits;
const [primary, ...rest] = fruits;
console.log(first); // 'apple'
console.log(rest); // ['banana', 'orange']
// 对象解构
const user = {
name: "李四",
age: 30,
address: {
city: "北京",
country: "中国",
},
};
const { name, age } = user;
const { name: userName, age: userAge } = user;
const {
address: { city },
} = user;
console.log(userName, userAge); // '李四', 30
console.log(city); // '北京'
// 展开运算符
const originalArray = [1, 2, 3];
const newArray = [...originalArray, 4, 5];
const originalObj = { a: 1, b: 2 };
const newObj = { ...originalObj, c: 3, b: 20 }; // b会被覆盖
// 函数参数中的使用
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3, 4, 5)); // 15JavaScript 的生态系统
框架和库
现代 JavaScript 开发离不开各种框架和库:
// React - 用户界面库
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>计数: {count}</p>
<button onClick={() => setCount(count + 1)}>
增加
</button>
</div>
);
}
// Vue - 渐进式框架
<template>
<div>
<p>{{ message }}</p>
<button @click="reverseMessage">反转消息</button>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello Vue!'
}
},
methods: {
reverseMessage() {
this.message = this.message.split('').reverse().join('');
}
}
}
</script>工具链
现代 JavaScript 开发需要各种工具支持:
// package.json - 项目依赖管理
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"react": "^18.0.0",
"axios": "^1.0.0"
},
"devDependencies": {
"webpack": "^5.0.0",
"babel-core": "^6.26.3"
},
"scripts": {
"start": "webpack serve",
"build": "webpack --mode production"
}
}
// Babel - JavaScript 转译器
// 将现代 JavaScript 转换为兼容旧浏览器的代码
// Webpack - 模块打包工具
// 将多个模块文件打包成少数几个优化过的文件JavaScript 的未来
不断演进的语言特性
JavaScript 仍在快速发展中:
// 即将到来的新特性(TC39提案)
// Optional Chaining (已在ES2020实现)
const user = {
name: "王五",
// address 可能不存在
};
const city = user?.address?.city || "未知城市";
// Nullish Coalescing Operator
const input = null;
const value = input ?? "默认值"; // 只在 null/undefined 时使用默认值
// BigInt (ES2020)
const bigNumber = 123456789012345678901234567890n;
// Private Class Fields (ES2022)
class Counter {
#count = 0; // 私有字段
increment() {
this.#count++;
return this.#count;
}
}跨平台开发
JavaScript 已经超越了 Web 浏览器,可以在多个平台运行:
// React Native - 移动应用开发
import { View, Text, Button } from "react-native";
function App() {
return (
<View>
<Text>Hello, Mobile!</Text>
<Button title="点击我" onPress={() => console.log("Pressed")} />
</View>
);
}
// Electron - 桌面应用开发
const { app, BrowserWindow } = require("electron");
function createWindow() {
const win = new BrowserWindow({
width: 800,
height: 600,
});
win.loadFile("index.html");
}
app.whenReady().then(createWindow);为什么学习 JavaScript 很重要?
1. Web 开发的核心语言
- 所有现代浏览器都原生支持 JavaScript
- 是实现用户交互和动态效果的唯一选择
- 与 HTML、CSS 共同构成前端开发的三大核心技术
2. 全栈开发能力
- 前端:React、Vue、Angular
- 后端:Node.js、Express、NestJS
- 移动端:React Native、Ionic
- 桌面端:Electron、Tauri
3. 庞大的生态系统
- npm 注册表中有超过 200 万个包
- 活跃的开源社区
- 丰富的学习资源和工具
4. 就业市场需求
JavaScript 开发者在全球范围内都有很高的需求,薪资待遇也相对较好。
总结
JavaScript 从一个简单的网页脚本语言,发展成为了当今最流行的编程语言之一。它不仅为静态网页赋予了生命,还扩展到了服务器端、移动端、桌面端等各个领域。
本节要点回顾:
- JavaScript 是解释型的、动态类型的编程语言
- 由布兰登·艾克在 1995 年创造,最初为了解决网页交互问题
- JavaScript 与 Java 是完全不同的语言,命名只是营销策略
- 现代 JavaScript(ES6+)具有丰富的语言特性和强大的功能
- JavaScript 可以在浏览器、服务器、移动端等多个平台运行
- 掌握 JavaScript 是现代 Web 开发的必备技能