一文詳解NodeJS和Javascript之間有什么區(qū)別
前言
這是一個(gè)非常經(jīng)典且重要的問題!Node.js 和 JavaScript 的關(guān)系不是“對(duì)立”或“并列”,而是“運(yùn)行環(huán)境”與“語(yǔ)言”的關(guān)系。下面從多個(gè)維度清晰解釋它們的區(qū)別與聯(lián)系。
一、一句話總結(jié)
JavaScript 是一門編程語(yǔ)言,Node.js 是一個(gè)能讓 JavaScript 在服務(wù)器端運(yùn)行的運(yùn)行時(shí)環(huán)境(Runtime)。
- 瀏覽器中的 JavaScript → 用于操作網(wǎng)頁(yè)(DOM、動(dòng)畫、交互)
- Node.js 中的 JavaScript → 用于開發(fā)后端服務(wù)(API、數(shù)據(jù)庫(kù)、文件系統(tǒng)等)
二、詳細(xì)對(duì)比
| 維度 | JavaScript | Node.js |
|---|---|---|
| 本質(zhì) | 編程語(yǔ)言(ECMAScript 標(biāo)準(zhǔn)) | JavaScript 的運(yùn)行時(shí)環(huán)境(基于 V8 引擎) |
| 運(yùn)行位置 | 瀏覽器(Chrome、Firefox 等) | 服務(wù)器 / 本地計(jì)算機(jī)(脫離瀏覽器) |
| 核心能力 | 操作 DOM、處理用戶事件、AJAX 請(qǐng)求 | 讀寫文件、訪問數(shù)據(jù)庫(kù)、啟動(dòng) HTTP 服務(wù)器、操作系統(tǒng)資源 |
| 全局對(duì)象 | window、document、navigator | global、process、__dirname、module |
| 模塊系統(tǒng) | ES Modules (import/export) 或 <script> 標(biāo)簽 | CommonJS (require/module.exports) + 支持 ES Modules |
| I/O 模型 | 異步(但受限于瀏覽器 API) | 事件驅(qū)動(dòng) + 非阻塞 I/O(核心優(yōu)勢(shì)) |
| 典型用途 | 網(wǎng)頁(yè)交互、前端框架(Vue/React) | 后端 API、微服務(wù)、腳本工具、實(shí)時(shí)應(yīng)用 |
三、關(guān)鍵區(qū)別詳解
1.運(yùn)行環(huán)境不同
- JavaScript 最初設(shè)計(jì)用于瀏覽器,只能操作網(wǎng)頁(yè)元素。
// 瀏覽器中有效 document.getElementById('btn').click(); alert('Hello'); - Node.js 讓 JS 脫離瀏覽器,可以:
// Node.js 中有效(瀏覽器中會(huì)報(bào)錯(cuò)?。? const fs = require('fs'); fs.readFileSync('data.txt');
2.沒有 DOM / BOM
- Node.js 沒有 window、document、localStorage 等瀏覽器對(duì)象。
- 你不能在 Node.js 中寫:
// 在 Node.js 中會(huì)報(bào)錯(cuò):document is not defined document.querySelector('h1');
3.擁有系統(tǒng)級(jí) API
Node.js 提供了瀏覽器沒有的能力:
// 讀寫文件
const fs = require('fs');
fs.writeFileSync('log.txt', 'Hello Server');
// 啟動(dòng) HTTP 服務(wù)器
const http = require('http');
http.createServer((req, res) => {
res.end('Hello from Node.js!');
}).listen(3000);
4.模塊系統(tǒng)差異
- 瀏覽器:原生支持 ES Modules(
import/export)<script type="module"> import { foo } from './utils.js'; </script> - Node.js(傳統(tǒng)):使用 CommonJS
// 導(dǎo)入 const express = require('express'); // 導(dǎo)出 module.exports = { hello: 'world' }; - 現(xiàn)代 Node.js(v14+):也支持 ES Modules(需
.mjs后綴或package.json中設(shè)"type": "module")
四、它們的關(guān)系圖
┌───────────────────┐
│ JavaScript │ ← 編程語(yǔ)言(ECMAScript)
└─────────┬─────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ 瀏覽器 │ │ Node.js │ │ Deno / Bun │
│ (Chrome等) │ │ (服務(wù)器環(huán)境) │ │ (新運(yùn)行時(shí)) │
└─────────────┘ └──────────────┘ └──────────────┘
所以:Node.js 是 JavaScript 的“宿主環(huán)境”之一,就像瀏覽器一樣。
五、舉個(gè)實(shí)際例子
假設(shè)你要開發(fā)一個(gè)“用戶注冊(cè)”功能:
前端(瀏覽器中的 JavaScript)
// 發(fā)送注冊(cè)請(qǐng)求
fetch('/api/register', {
method: 'POST',
body: JSON.stringify({ email: 'user@example.com' })
});
后端(Node.js 中的 JavaScript)
// 接收請(qǐng)求,保存到數(shù)據(jù)庫(kù)
const express = require('express');
const app = express();
app.post('/api/register', (req, res) => {
// 1. 驗(yàn)證數(shù)據(jù)
// 2. 連接數(shù)據(jù)庫(kù)
// 3. 保存用戶
// 4. 返回結(jié)果
res.json({ success: true });
});
?? 前后端都用 JavaScript,但運(yùn)行環(huán)境和能力完全不同!
常見誤區(qū)澄清
| 誤區(qū) | 正確理解 |
|---|---|
| “Node.js 是一種新語(yǔ)言” | Node.js 不是語(yǔ)言,是運(yùn)行時(shí) |
| “學(xué)了前端 JS 就會(huì) Node.js” | 語(yǔ)法相同,但 API 和思維模式不同(需學(xué) Node 特有模塊) |
| “Node.js 可以替代瀏覽器 JS” | 兩者用途不同,通常配合使用(全棧開發(fā)) |
總結(jié)
| JavaScript | Node.js | |
|---|---|---|
| 是什么 | 編程語(yǔ)言 | JS 運(yùn)行時(shí) |
| 在哪跑 | 瀏覽器 | 服務(wù)器/本地 |
| 能做什么 | 操作網(wǎng)頁(yè) | 操作文件、網(wǎng)絡(luò)、系統(tǒng) |
| 是否依賴對(duì)方 | 不依賴 | 依賴 JS 語(yǔ)言 |
掌握這個(gè)區(qū)別,是邁向 全棧開發(fā) 牛馬的第一步!
到此這篇關(guān)于NodeJS和Javascript之間有什么區(qū)別的文章就介紹到這了,更多相關(guān)NodeJS和Js之間區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Node使用Puppeteer完成一次復(fù)雜的爬蟲
這篇文章主要介紹了詳解Node使用Puppeteer完成一次復(fù)雜的爬蟲,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
node.js利用express自動(dòng)搭建項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于node.js利用express自動(dòng)搭建項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
使用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證碼
這篇文章主要介紹了利用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證功能,基本流程代碼實(shí)現(xiàn)給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-02-02
Nest.js參數(shù)校驗(yàn)和自定義返回?cái)?shù)據(jù)格式詳解
這篇文章主要給大家介紹了關(guān)于Nest.js參數(shù)校驗(yàn)和自定義返回?cái)?shù)據(jù)格式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Nodejs實(shí)現(xiàn)獲取實(shí)時(shí)數(shù)據(jù)的三種主流方式詳解
這篇文章主要為大家詳細(xì)介紹了Nodejs前端獲取實(shí)時(shí)數(shù)據(jù)的三種主流方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

