一、Node.jsREPL到底是什么
REPL是Read-Eval-PrintLoop的缩写,直译就是“读取—求值—打印—循环”。Node.js自带这个交互式运行环境,你不需要新建.js文件,直接在终端里敲JavaScript代码就能立刻看到结果。
它四个环节的分工很明确:
-
Read:读取你输入的代码,解析成JavaScript数据结构,放进内存。
-
Eval:对解析后的代码求值。
-
Print:把结果打印出来。
-
Loop:回到等待输入状态,直到你按两次
Ctrl+C才退出。
日常开发里,REPL适合做几件事:验证一小段逻辑、快速查看某个模块的API、调试表达式结果、学习JavaScript概念。它不适合写完整项目,但作为“随手验证”的工具,效率很高。
本节课程知识要点:REPL是Node.js运行时自带的交互环境,核心价值是即时反馈,不是替代文件开发。
二、启动与退出:先把入口mō清楚
启动方式很直接,在命令提示符、PowerShell或终端输入:
node
回车后会出现类似输出:
Welcome to Node.js vXX.X.X.
Type ".help" for more information.
>
版本号会随你安装的Node.js版本变化,>提示符表示已经进入REPL,可以开始输入代码。
退出有两种常用方式:
-
输入
.exit命令; -
连按两次
Ctrl+C。
另外Ctrl+D也能终止REPL。我个人习惯用.exit,因为动作明确,不会误触。
三、算术表达式:验证运算符优先级
进入REPL后,直接输入表达式即可。
示例1:加减运算
> 10 + 20 - 5
25
REPL按JavaScript运算符优先级求值,先算10+20,再减5,返回25。
示例2:带括号的表达式
> 10 + 12 + (5 * 4) / 7
24.857142857142858
这里先算括号里的5*4,再做除法,之后加上前面的值。REPL不会帮你“美化”结果,浮点数该多少位就多少位。
踩坑提醒:REPL里做浮点运算时,别把结果直接当成精确值去比较。比如0.1+0.2在REPL里不会得到0.3,这是IEEE754浮点数的老问题,不是REPL的锅。
四、变量:赋值、声明与返回值差异
REPL对“赋值表达式”和“变量声明”的处理不一样。
> x = 10
10
> var y = 20
undefined
> x
10
> y
20
解释一下:
-
x=10是赋值表达式,本身有返回值,所以REPL打印10; -
vary=20是变量声明,声明语句不产生结果值,所以返回undefined; -
输入
x、y时,REPL打印它们存储的值。
个人建议:在REPL里临时验证用赋值表达式没问题,但正式代码里不要省略var/let/const,否则会污染全局作用域,后续排查很麻烦。
五、多行表达式:do-while循环
REPL支持多行输入。输入未完成的语句时,提示符会从>变成|,表示还在等待后续输入。
> var x = 0
undefined
> do {
| x++
| console.log("x: " + x);
| } while (x < 10);
x: 1
x: 2
...
x: 10
undefined
过程拆解:
-
varx=0声明变量,返回undefined; -
进入
do...while多行输入,|是续行提示符; -
循环体每次执行
x++并打印,直到x达到10; -
循环语句本身不返回值,结束后REPL再次打印
undefined。
经验分享:多行输入时如果写错了,不想继续,可以用.break退出当前多行输入,回到普通>状态,不用把整段敲完。
六、下划线_变量:复用上一次结果
REPL会把最近一次求值结果自动存到_变量里。
> 10 + 20
30
> _
30
> _ + 15
45
> _
45
10+20得到30,_存下这个结果;输入_显示30;_+15用30加15得到45,_更新为45。
这个特性在做连续计算时很省事,不用反复定义临时变量。但要注意:_只保存最近一次结果,下一次求值会覆盖它。别把它当成持久变量用。
七、内置REPL命令:一张表看懂
| 命令 | 说明 |
|---|---|
Ctrl+C |
中断当前命令 |
Ctrl+C两次 |
终止REPL |
Ctrl+D |
终止REPL |
| 上/下方向键 | 查看命令历史、修改之前的命令 |
Tab键 |
自动补全命令或列出候选 |
.help |
列出所有可用REPL命令 |
.break |
退出当前多行输入 |
.clear |
清空当前REPL上下文,重置已加载的变量和模块 |
.savefilename |
保存当前REPL会话到文件 |
.loadfilename |
把文件内容加载进当前REPL会话 |
.exit |
退出REPL,回到命令行 |
.editor |
进入编辑器模式,编写并执行多行JavaScript代码 |
.clear这个命令值得单独说一句。当你加载了一堆模块、定义了一堆变量,上下文越来越乱时,.clear能重置环境,比反复退出重进更利落。
八、在REPL里加载模块
REPL允许直接用require()加载Node.js内置模块,不用建文件。
加载os模块
> const os = require('os');
undefined
> os.platform();
'win32'
os.platform()的返回值取决于操作系统:Windows返回'win32',Linux返回'linux',macOS返回'darwin'。这里返回undefined是因为const声明不产生结果值。
加载fs模块
> const fs = require('fs');
undefined
> Object.keys(fs).slice(0, 5);
[ 'appendFile', 'appendFileSync', 'access', 'accessSync', 'chown' ]
Object.keys(fs)列出fs模块的可枚举属性,slice(0,5)只取前五个。用这种方式可以快速确认某个模块提供了哪些方法。
反思:以前我习惯直接翻文档查模块API,后来发现用REPL配合Object.keys()和Tab补全更快。尤其在不确定方法名拼写时,Tab键能直接列出候选,比搜索省事。
九、let与const在REPL中的表现
let示例
> let age = 25
undefined
> age
25
> age = 26
26
> age
26
let声明的变量可以重新赋值。声明时返回undefined,输入变量名时返回当前值。
const示例
> const PI = 3.14;
undefined
> PI
3.14
> PI = 3.14159
TypeError: Assignment to constant variable.
const声明后不能重新赋值,尝试修改会抛出TypeError。在REPL里这个错误会直接打印出来,不会中断整个会话,你可以继续输入下一条命令。
为什么用const而不是var:const和let是块级作用域,var是函数作用域。在REPL里临时验证时差异不明显,但把代码从REPL搬到正式文件时,const能避免意外重新赋值,减少低级错误。
十、本节课程知识要点
-
REPL四个环节:Read、Eval、Print、Loop。
-
启动用
node,退出用.exit或两次Ctrl+C。 -
赋值表达式有返回值,变量声明返回
undefined。 -
_保存最近一次求值结果,会被下一次求值覆盖。 -
.clear重置上下文,.break退出多行输入,.editor写多行代码。 -
require()可在REPL中直接加载模块,配合Object.keys()和Tab补全查看API。 -
let可重新赋值,const不可重新赋值,var在正式代码中尽量少用。
REPL不是玩具,把它当成随手可用的验证环境,能省下不少建文件、跑脚本的时间。关键是搞清楚它的边界:适合短逻辑验证,不适合长期维护的代码。