JavaScript 是 Web 的编程语言
JavaScript 是运行在浏览器中的编程语言。当网页响应一次点击、校验表单、给菜单加动画,或者不刷新就加载新内容时,背后就是 JavaScript。每台设备上的每个浏览器都内置了 JavaScript 引擎,这让它成为唯一一种在 Web 上原生运行的语言。
如今它也能在浏览器之外运行。Node.js、Deno 和 Bun 让你可以用 JavaScript 编写服务器、命令行工具、构建脚本和 API。同一种语言既能做前端,也能做后端,这正是它被如此广泛使用的重要原因。
先简单看看 JavaScript 长什么样:
三行代码,三个概念:声明一个变量,调用一个内置函数,打印一个模板字符串。在真实的 JavaScript 代码中,你每一页都会看到这三样东西。
JavaScript 在哪里运行
JavaScript 本身只是一份语言规范(叫作 ECMAScript)。要真正运行它,你需要一个引擎,也就是读取并执行你的代码的程序。你会遇到的有两种:
- 浏览器。 Chrome 和 Edge 使用 V8,Firefox 使用 SpiderMonkey,Safari 使用 JavaScriptCore。打开一个网页,按 F12,把 JavaScript 粘贴到控制台(Console)面板里,它会立即运行。
- Node.js。 它把 V8 从浏览器中拿出来,并让它能访问文件系统、网络和操作系统。服务器端 JavaScript 就是这样实现的。
// Run in a browser console:
document.title = "New tab title";
// Run with Node.js:
// $ node script.js
浏览器中的 JavaScript 可以操作页面(DOM),但不能访问你的文件系统。Node.js 中的 JavaScript 可以读取文件、打开 socket,但没有页面可以操作。同一种语言,不同的超能力。
JavaScript 用来做什么
简短的回答:几乎所有和 Web 有关的东西。详细一点的回答,大致按你接触到的顺序排列:
- 交互式网页。 表单校验、下拉菜单、弹窗、实时搜索、拖放。
- 单页应用。 Gmail、Figma、Notion、Linear:整个应用都由 JavaScript 渲染和更新,通常借助 React、Vue 或 Svelte 这样的框架。
- 后端服务器。 用 Node.js、Express、Fastify 或 NestJS 构建的 REST API、GraphQL 接口和实时服务。
- 构建与开发工具。 打包工具(Vite、esbuild、webpack)、代码检查工具(ESLint)、测试运行器(Vitest、Jest)。
- 跨平台应用。 基于 Electron 的桌面应用(VS Code、Slack、Discord),以及基于 React Native 的移动应用。
第一天你不需要了解所有这些。但知道它们的存在是值得的,这样“只是 JavaScript 而已”这句话就不会让你觉得它有多局限。
JavaScript 实际上是如何运行的
一个非常简化的思维模型:你编写源代码,引擎把它解析成内部表示,然后执行。现代引擎使用 JIT(即时)编译:先快速开始解释执行,再在程序运行期间把频繁执行的代码路径优化成机器码。
发布 JavaScript 之前,你不需要把它编译成二进制文件。你把源代码交给浏览器(或 Node),剩下的都由引擎处理:
把它粘贴到浏览器控制台中,或者保存为 greet.js 后运行 node greet.js,两种方式的输出都一样。对于这么简单的代码,不需要编译步骤,不需要构建配置,也不需要安装任何东西。
JavaScript 与 Java
它们听起来很像,但实际上完全不像。JavaScript 在 1995 年取这个名字,是为了借当时 Java 的热度,这个营销决定从那以后一直让初学者困惑。
| JavaScript | Java | |
|---|---|---|
| 类型 | 动态类型 | 静态类型 |
| 运行环境 | 浏览器、Node.js | JVM |
| 编程范式 | 多范式,基于原型 | 基于类的面向对象 |
| 编译 | JIT,无需构建步骤 | 先编译成字节码 |
如果有人告诉你“我学过 Java,所以我会 JavaScript”,那他其实不会。把它们当作两种碰巧共用四个字母的不同语言就好。
JavaScript 与 TypeScript
TypeScript 就是在 JavaScript 之上加了一套类型系统。你写带类型注解的代码,TypeScript 编译器检查它们,输出的是普通的 JavaScript,任何能运行 JavaScript 的地方都能运行。
// JavaScript - types are implicit:
function add(a, b) {
return a + b;
}
// TypeScript - types are explicit:
function add(a: number, b: number): number {
return a + b;
}
每个有效的 JavaScript 文件都是有效的 TypeScript 文件,这意味着 TypeScript 不是竞争对手,而是超集。如今大多数大型代码库都使用 TypeScript,但先学 JavaScript 才是正确的顺序。不了解类型是加在什么之上的,你就无法理解 TypeScript 的作用。
简短的历史,帮你理解那些怪异之处
JavaScript 是 Netscape 的 Brendan Eich 在 1995 年用十天写出来的。这段起源很重要,因为语言中的一些粗糙之处(宽松相等、自动分号插入、typeof null === "object")都源于极端时间压力下做出的决定,之后为了保持 Web 的向后兼容又被固定了下来。
这门语言的标准叫 ECMAScript,每年发布一个新版本(ES2015 是最重要的一版:let、const、箭头函数、类、模块)。当有人说“ES6”或“现代 JavaScript”时,指的大致是 2015 年及之后、如今已被普遍支持的那套特性。
现代 JavaScript 写起来确实很舒服。老旧的部分依然存在,但只要养成我们在整个课程中会讲到的习惯,基本都能避开它们。
要点总结
- JavaScript 运行在所有浏览器中,通过 Node.js 也能运行在服务器上。
- 几乎所有和 Web 有关的东西都会用到它:界面、后端、工具,甚至桌面和移动应用。
- 它不是 Java。TypeScript 是它的超集,增加了静态类型。
- 这门语言有一些历史遗留的怪异之处;你实际要写的是现代 JavaScript(ES2015+)。
下一节:运行 JavaScript
背景介绍够多了,现在该真正运行一些代码了。下一篇文档会介绍初学者运行 JavaScript 的三个地方:浏览器控制台、HTML 文件,以及命令行中的 Node.js。
常见问题
JavaScript 用通俗的话说是什么?
JavaScript 是一种运行在浏览器中、也能(通过 Node.js)运行在服务器上的编程语言。网页之所以能交互,靠的就是它:响应点击,不刷新就更新页面,从 API 获取数据。它是唯一一种在所有浏览器中原生运行的语言。
JavaScript 能用来做什么?
从小型的界面交互(下拉菜单、表单校验)到完整的 Web 应用(Gmail、Figma、Notion),再到后端服务器(Node.js、Deno)、移动应用(React Native)、桌面应用(基于 Electron 的 VS Code)和构建工具,都可以用它来做。只要是在浏览器里运行或者和 Web 打交道的东西,多半都有 JavaScript 的参与。
JavaScript 和 Java 是一回事吗?
不是。它们是两种毫无关系的语言,名字相似只是出于当年的营销原因。Java 是一种静态类型、基于类的语言,运行在 JVM 上。JavaScript 是动态类型的,运行在浏览器和 Node 中,设计思路也大不相同。它们唯一真正共有的,就是名字的前四个字母。
JavaScript 和 TypeScript 有什么区别?
TypeScript 就是 JavaScript 加上一套类型系统。你写带类型注解的代码,由编译器检查类型,最终输出的是普通的 JavaScript。每个有效的 JavaScript 文件也都是有效的 TypeScript。学 JavaScript 不需要先学 TypeScript,但如今大多数大型代码库都在用它。