Skip to content

JavaScript 简介

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 = 42
value = '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)) // 10
console.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 API
fetch('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
}
// 后端 API
app.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):

版本年份重要特性
ES52009严格模式、JSON、数组方法
ES6/ES20152015let/const、箭头函数、Promise、Class
ES20162016includes()、指数运算符
ES20172017async/await、Object.entries()
ES20202020可选链?.、空值合并??
ES20232023数组分组、从后查找

从 ES2015 开始,每年发布一个版本,按年份命名。

// ES5 写法
var self = this
arr.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,配合以下扩展:

包管理器#

Terminal window
# npm(Node.js 自带)
npm install lodash
# pnpm(更快、更省空间)
pnpm add lodash
# 运行脚本
npm run dev
pnpm dev

学习路线建议#

JavaScript 基础
ES6+ 新特性
DOM 操作与事件
异步编程(Promise、async/await)
前端框架(React/Vue)
Node.js 与全栈开发

🎯 学习建议:

  1. 多写代码:看再多教程不如亲手实践
  2. 理解原理:不只是会用,要知道为什么
  3. 阅读文档:MDN 是最权威的参考资料
  4. 参与项目:找开源项目练手,或自己做小项目

常见误区#

🙋 JavaScript 和 Java 什么关系?#

没有关系。JavaScript 最初为了营销蹭了 Java 的热度,但它们是完全不同的语言。

🙋 JavaScript 只能做前端吗?#

早已不是了。Node.js 让 JavaScript 进入服务端,Electron 进入桌面端,React Native 进入移动端。

🙋 JavaScript 性能很差?#

现代 JavaScript 引擎(V8、SpiderMonkey)经过多年优化,性能已经很强。Node.js 处理高并发的能力甚至优于许多传统后端语言。

总结#

JavaScript 从一门”玩具语言”成长为最流行的编程语言之一,其成功源于:

作为 Web 开发的必修课,JavaScript 值得每个开发者深入学习。