Skip to content

JavaScript 介绍与历史:赋予网页生命的编程语言

什么是 JavaScript?

JavaScript 是一种高级的、解释型的编程语言,它为网页添加了交互性和动态功能。如果说 HTML 是网页的骨架,CSS 是网页的外貌,那么 JavaScript 就是网页的灵魂,它让静态的网页"活"起来。

想象一下制作一个机器人:

  • HTML 构建了机器人的身体结构
  • CSS 设计了机器人的外观造型
  • JavaScript 编写了机器人的行为和思维
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 运行时即时解释执行

javascript
// 这段代码会立即执行,无需编译
let message = "Hello, JavaScript!";
console.log(message); // 输出: Hello, JavaScript!

// 动态执行代码
const code = "let x = 10; let y = 20; console.log(x + y);";
eval(code); // 输出: 30

2. 动态类型系统

JavaScript 的变量类型是动态的,可以在运行时改变:

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)); // 输出: true

3. 基于原型的面向对象

JavaScript 使用原型继承而不是传统的类继承(ES6 引入了 class 语法糖):

javascript
// 传统基于原型的对象创建
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 特别适合处理用户交互事件:

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
// 最初的 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 开始标准化:

主要版本里程碑

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 最初就是为浏览器设计的运行环境:

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 带到了服务器端:

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 运行时:

javascript
// Deno - 现代化的 JavaScript/TypeScript 运行时
// 支持TypeScript开箱即用,更安全的权限控制

// Bun - 极快的 JavaScript 运行时
// 专注于性能优化和包管理

// Cloudflare Workers - 边缘计算环境
// 在全球边缘节点上运行 JavaScript 代码

现代 JavaScript 特性

1. 模块系统

现代 JavaScript 支持模块化开发:

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)); // 输出: 30

2. 异步编程

JavaScript 提供了多种异步编程模式:

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 支持函数式编程范式:

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 提供了便利的数据处理语法:

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)); // 15

JavaScript 的生态系统

框架和库

现代 JavaScript 开发离不开各种框架和库:

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 开发需要各种工具支持:

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 仍在快速发展中:

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 浏览器,可以在多个平台运行:

javascript
// 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 开发的必备技能

上次更新时间: