JavaScript 是 Web 开发的核心语言,从最初的表单验证发展到如今的全栈开发,它的影响力远超预期。
🎯 JavaScript 是什么#
JavaScript 是一门动态的、弱类型的脚本语言,最初设计用于网页交互。看一个简单的例子:
// 在浏览器控制台运行console.log('Hello, JavaScript!')
// 操作网页元素document.body.style.backgroundColor = '#f0f0f0'
// 响应用户操作document.addEventListener('click', () => { alert('你点击了页面!')})这三行代码展示了 JavaScript 的核心能力:输出信息、操作页面、响应交互。
JavaScript 的诞生#
1995 年,Brendan Eich 在网景公司用 10 天时间创造了 JavaScript(最初叫 Mocha,后改名 LiveScript)。为了蹭 Java 的热度,最终改名为 JavaScript,但两者除了名字相似,关系不大。
// JavaScript 和 Java 的对比
// JavaScript:动态类型let value = 42value = 'hello' // 完全合法value = { name: '对象' } // 也没问题
// Java 是静态类型语言,变量类型声明后不能改变// int value = 42;// value = "hello"; // 编译错误🤔 JavaScript 的命名确实造成了很多误解,但这反而帮助它获得了早期的关注度。
核心特点#
动态类型#
变量的类型在运行时确定,同一个变量可以存储不同类型的值:
let data = 100 // 数字console.log(typeof data) // "number"
data = '一百' // 字符串console.log(typeof data) // "string"
data = [1, 2, 3] // 数组console.log(typeof data) // "object"
data = function () {} // 函数console.log(typeof data) // "function"✅ 灵活性高,开发效率快 🔶 缺乏类型检查,可能引入隐蔽 bug
基于原型的面向对象#
JavaScript 不使用传统的类继承,而是通过原型链实现对象间的关系:
// 创建一个原型对象const animal = { speak() { console.log(`${this.name} 发出声音`) },}
// 基于原型创建新对象const dog = Object.create(animal)dog.name = '小黑'dog.speak() // "小黑 发出声音"
// 查看原型链console.log(Object.getPrototypeOf(dog) === animal) // true函数是一等公民#
函数可以像普通值一样赋值、传递和返回:
// 函数赋值给变量const greet = function (name) { return `你好,${name}!`}
// 函数作为参数传递const names = ['张三', '李四', '王五']const greetings = names.map(greet)console.log(greetings)// ["你好,张三!", "你好,李四!", "你好,王五!"]
// 函数返回函数function createMultiplier(factor) { return function (number) { return number * factor }}
const double = createMultiplier(2)const triple = createMultiplier(3)console.log(double(5)) // 10console.log(triple(5)) // 15单线程与事件驱动#
JavaScript 在单线程中运行,通过事件循环处理异步���作:
console.log('1. 开始')
setTimeout(() => { console.log('2. 定时器回调')}, 0)
Promise.resolve().then(() => { console.log('3. Promise 回调')})
console.log('4. 结束')
// 输出顺序:// 1. 开始// 4. 结束// 3. Promise 回调// 2. 定时器回调🙋 为什么 setTimeout 设置 0 毫秒,却最后执行?
这涉及到事件循环机制:同步代码先执行,微任务(Promise)优先于宏任务(setTimeout)。
运行环境#
浏览器环境#
浏览器是 JavaScript 最原始的运行环境,提供 DOM、BOM 等 API:
// DOM 操作const button = document.createElement('button')button.textContent = '点我'button.onclick = () => console.log('按钮被点击')document.body.appendChild(button)
// BOM 操作console.log(window.innerWidth) // 窗口宽度console.log(navigator.userAgent) // 浏览器信息console.log(location.href) // 当前 URL
// Web APIfetch('https://api.example.com/data') .then((response) => response.json()) .then((data) => console.log(data))Node.js 环境#
2009 年 Ryan Dahl 创建了 Node.js,让 JavaScript 可以在服务端运行:
// Node.js 文件操作// 需要在 Node.js 环境运行(node script.js)const fs = require('fs')
// 读取文件fs.readFile('./package.json', 'utf8', (err, data) => { if (err) throw err console.log(JSON.parse(data).name)})
// 创建 HTTP 服务器const http = require('http')
const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end('Hello from Node.js!')})
server.listen(3000, () => { console.log('服务器运行在 http://localhost:3000')})其他运行环境#
| 环境 | 用途 | 特点 |
|---|---|---|
| Electron | 桌面应用 | VS Code、Slack 都基于它 |
| React Native | 移动应用 | 一套代码,iOS/Android |
| Deno | 服务端 | Node.js 作者的新项目 |
| QuickJS / Hermes | 嵌入式/移动 | 轻量级 JavaScript 引擎 |
应用场景#
前端开发#
这是 JavaScript 的主战场:
// React 组件示例function Counter() { const [count, setCount] = React.useState(0)
return ( <div> <p>点击次数:{count}</p> <button onClick={() => setCount(count + 1)}>增加</button> </div> )}后端开发#
使用 Node.js 框架构建 API 服务:
// Express.js 示例const express = require('express')const app = express()
app.get('/api/users', (req, res) => { res.json([ { id: 1, name: '张三' }, { id: 2, name: '李四' }, ])})
app.listen(3000)全栈开发#
同一种语言贯穿前后端,降低切换成本:
// 前后端共享类型定义(TypeScript)interface User { id: number name: string email: string}
// 后端 APIapp.get('/api/user/:id', async (req, res) => { const user: User = await db.findUser(req.params.id) res.json(user)})
// 前端调用const response = await fetch('/api/user/1')const user: User = await response.json()跨平台开发#
// React Native - 移动应用import { View, Text, Button } from 'react-native'
function App() { return ( <View> <Text>我的第一个移动应用</Text> <Button title="点击" onPress={() => alert('Hello!')} /> </View> )}
// Electron - 桌面应用const { app, BrowserWindow } = require('electron')
app.whenReady().then(() => { const win = new BrowserWindow({ width: 800, height: 600 }) win.loadFile('index.html')})ECMAScript 标准#
JavaScript 的语言规范由 ECMA 国际组织制定,称为 ECMAScript(简称 ES):
| 版本 | 年份 | 重要特性 |
|---|---|---|
| ES5 | 2009 | 严格模式、JSON、数组方法 |
| ES6/ES2015 | 2015 | let/const、箭头函数、Promise、Class |
| ES2016 | 2016 | includes()、指数运算符 |
| ES2017 | 2017 | async/await、Object.entries() |
| ES2020 | 2020 | 可选链?.、空值合并?? |
| ES2023 | 2023 | 数组分组、从后查找 |
从 ES2015 开始,每年发布一个版本,按年份命名。
// ES5 写法var self = thisarr.forEach(function (item) { console.log(self.prefix + item)})
// ES6+ 写法arr.forEach((item) => { console.log(this.prefix + item)})开发工具#
浏览器开发者工具#
按 F12 打开,是前端调试的必备工具:
// Console 面板常用操作console.log('普通日志')console.warn('警告信息')console.error('错误信息')console.table([ { name: '张三', age: 25 }, { name: '李四', age: 30 },])console.time('操作耗时')// ... 一些操作console.timeEnd('操作耗时')代码编辑器#
推荐使用 VS Code,配合以下扩展:
- ESLint:代码规范检查
- Prettier:代码格式化
- JavaScript (ES6) code snippets:代码片段
包管理器#
# npm(Node.js 自带)npm install lodash
# pnpm(更快、更省空间)pnpm add lodash
# 运行脚本npm run devpnpm dev学习路线建议#
JavaScript 基础 ↓ES6+ 新特性 ↓DOM 操作与事件 ↓异步编程(Promise、async/await) ↓前端框架(React/Vue) ↓Node.js 与全栈开发🎯 学习建议:
- 多写代码:看再多教程不如亲手实践
- 理解原理:不只是会用,要知道为什么
- 阅读文档:MDN 是最权威的参考资料
- 参与项目:找开源项目练手,或自己做小项目
常见误区#
🙋 JavaScript 和 Java 什么关系?#
没有关系。JavaScript 最初为了营销蹭了 Java 的热度,但它们是完全不同的语言。
🙋 JavaScript 只能做前端吗?#
早已不是了。Node.js 让 JavaScript 进入服务端,Electron 进入桌面端,React Native 进入移动端。
🙋 JavaScript 性能很差?#
现代 JavaScript 引擎(V8、SpiderMonkey)经过多年优化,性能已经很强。Node.js 处理高并发的能力甚至优于许多传统后端语言。
总结#
JavaScript 从一门”玩具语言”成长为最流行的编程语言之一,其成功源于:
- 低门槛:浏览器即开发环境,所见即所得
- 高上限:可以构建从简单网页到复杂应用的各种项目
- 生态繁荣:npm 拥有超过 200 万个包
- 持续进化:每年都有新特性加入
作为 Web 开发的必修课,JavaScript 值得每个开发者深入学习。