文章目录
- JSON.stringify(value,replace?,space?)
- [JS 异步处理](#JS 异步处理)
-
- 执行原理
- [JS 异步方案演进(Ajax 配套使用)](#JS 异步方案演进(Ajax 配套使用))
-
- [1. 回调函数 callback](#1. 回调函数 callback)
- [2. Promise + then()](#2. Promise + then())
- [3. async/await(最优方案)](#3. async/await(最优方案))
- 模块化补充说明
- [实战案例:Node 服务端 + 原生 Ajax(XHR) 完整演示](#实战案例:Node 服务端 + 原生 Ajax(XHR) 完整演示)
-
- [一、Node 服务端代码(server.js)](#一、Node 服务端代码(server.js))
- 二、前端页面代码(index.html)
- 全文总结
- 核心知识点复盘
- 常见问题/避坑指南
JSON.stringify(value,replace?,space?)
在前后端网络传输场景中,JavaScript 对象、数组无法直接通过网络发送,需要先转换成标准的 JSON 格式字符串,JSON.stringify 就是实现数据序列化的核心方法。
方法参数详解
语法:JSON.stringify(value, replace?, space?)
- value(必传)
需要被序列化的 JS 数据,支持对象、数组、基础类型,是网络数据交互的核心入参。 - replace(可选)
用于对数据做筛选、过滤、改写,默认值为null。
- 传
null:不对原数据做任何处理,原样完成序列化; - 传数组:仅保留数组内指定的字段,过滤多余属性;
- 传函数:可自定义处理每一组键值对,实现数据脱敏、字段修改等逻辑。
- space(可选)
用于设置格式化缩进空格数,服务于团队代码规范与代码可读性。
- 传入数字(1~10):代表缩进空格数量,开发环境常用 2 / 4 个空格格式化;
- 省略/不传:输出单行压缩字符串,体积更小,适合生产环境网络传输。
核心作用
专门将 JS 对象、数组转为 JSON 字符串,适配 HTTP 网络传输规则,是 Ajax 前后端传参、返回数据的必备操作。
JS 异步处理
JavaScript 是单线程语言 ,同一时刻只会执行一段同步代码。为了避免网络请求、定时器、事件等耗时操作阻塞主线程、造成页面卡死,JS 引入了事件循环(Event Loop) 机制管理异步任务。
执行原理
- 优先执行主线程中的所有同步代码;
- 遇到异步任务时,不会等待结果,直接跳过并继续向下执行同步代码,同时将异步回调放入 Event Loop 任务队列;
- 当主线程同步代码全部执行完毕后,再从任务队列中取出异步回调函数依次执行。
JS 异步方案演进(Ajax 配套使用)
1. 回调函数 callback
最早的异步实现方式,原生 XHR、定时器均基于回调函数实现。
- 优点:浏览器原生支持,上手简单;
- 缺点:多层异步嵌套会形成回调地狱,代码可读性、可维护性极差。
2. Promise + then()
ES6 推出的异步解决方案,专门用来封装异步任务,通过 then() 链式调用替代多层嵌套。
- 优点:解决回调地狱,代码结构扁平化,支持统一异常捕获;
- 缺点:本质依旧是回调写法,复杂场景下链式调用依然繁琐。
3. async/await(最优方案)
基于 Promise 封装的语法糖,是目前前端最推荐、综合表现最优的异步方案。
- 优势:代码写法和同步代码完全一致,逻辑直观清晰,错误处理简单,企业级项目主流用法。
模块化补充说明
早期前端没有统一模块化规范,依靠全局函数实现功能拆分;Node.js 诞生后率先落地模块化体系:
- CommonJS :Node 早期标准,使用
require导入模块、module.exports导出模块; - ESM :ES6 推出的新标准,使用
import/export default,是目前前后端通用的主流模块化方案。
实战案例:Node 服务端 + 原生 Ajax(XHR) 完整演示
一、Node 服务端代码(server.js)
使用 Node 内置 http 模块搭建简易接口服务,无需安装第三方依赖。
javascript
// 导入node内置的http 模块(CommonJS模块化规范)
const http = require("http");
// 创建HTTP服务
http.createServer((req,res)=>{
// 定义接口返回的模拟数据
const todos = [{
id:1,
title:"过四六级",
completed:false
},
{
id:2,
title:"回家过节",
completed:false
}]
// 匹配首页路由
if(req.url === "/"){
res.end("hello world");
}
// 匹配todos数据接口路由
if(req.url === "/todos"){
// 设置跨域响应头,允许前端跨域请求(本地测试使用)
res.setHeader("Access-Control-Allow-Origin","*");
// 声明响应数据类型为JSON
res.setHeader("Content-Type","application/json");
// 二进制文本 JSON序列化:对象转字符串,响应给前端
res.end(JSON.stringify(todos));
}
// 监听3000端口,启动服务
}).listen(3000,()=>{
console.log("server is running on 3000 port");
})
服务端代码关键解析
Access-Control-Allow-Origin: "*":开启跨域,本地调试专用,生产环境不建议使用通配符;Content-Type: "application/json":告知浏览器本次响应的数据格式为 JSON;JSON.stringify(todos):核心序列化操作,将 JS 数组转为字符串完成网络传输。
二、前端页面代码(index.html)
使用原生 XMLHttpRequest(Ajax 底层原生 API)发起请求,获取后端数据并动态渲染页面。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul id="todos"></ul>
<button id="btn">按钮</button>
<script>
console.log("start");
// 事件的注册(异步事件)
document.getElementById("btn").addEventListener("click",function(){
console.log("点击按钮");
})
// fetch 的前辈:原生XMLHttpRequest,Ajax底层实现
// 底层本质是JS主动发起HTTP接口请求,实现页面无刷新更新,也是WEB 2.0 核心能力
const xhr = new XMLHttpRequest();
// 打开一个http 通道:请求方式、接口地址、是否异步(true=异步)
xhr.open("GET","http://localhost:3000/todos",true);
console.log("start");
// 回调函数 callback:监听请求状态变化
xhr.onreadystatechange = function(){
console.log(xhr.readyState);
// 状态码200=请求成功,readyState=4=请求全部完成
if(xhr.status === 200 && xhr.readyState === 4){
// json字符串转换为数组对象(反序列化)
const todos = JSON.parse(xhr.responseText);
// 动态拼接HTML,渲染到页面
document.getElementById("todos").innerHTML =
todos.map(todo=>`<li>${todo.title}</li>`).join("");
}
}
console.log("end");
// 发送请求
xhr.send();
</script>
</body>
</html>
前端代码关键解析
- 执行顺序:同步代码
start→end优先执行,网络请求回调延后执行,体现 JS 异步特性; xhr.readyState:请求状态标识,等于 4 代表请求彻底完成,是核心判断条件;JSON.parse():反序列化,将后端返回的 JSON 字符串还原为 JS 数组/对象,供前端逻辑使用;- 整个流程无需刷新页面,即可更新页面内容,这就是 Ajax 的核心价值。
全文总结
- Ajax 实现页面无刷新数据交互,依赖 JSON 序列化/反序列化 完成前后端数据传输;
- JS 单线程 + 事件循环(Event Loop)是 Ajax 异步执行的底层原理,保证请求不阻塞页面;
- JS 异步方案分为三代:回调函数、Promise、async/await,
async/await为目前最优选择; - Node 端使用 CommonJS 模块化,前端主流使用 ESM 模块化,是前后端开发基础规范;
- 完整流程:服务端对象 →
JSON.stringify(对象转 json )序列化 → 网络传输 → 前端JSON.parse(json 转成数组)反序列化 → 页面渲染。
核心知识点复盘
JSON.stringify三参数作用:数据序列化、数据过滤、格式化缩进,区分开发/生产环境使用;- JS 异步核心规则:同步优先执行,异步进入任务队列,主线程空闲后再执行回调;
- 异步方案优先级:
async/await>Promise.then> 原生回调函数; - 原生 Ajax(XHR)核心流程:创建实例 → open 建立通道 → 绑定状态监听 → send 发送请求;
- 前后端数据流转公式:JS对象 ↔ JSON字符串(序列化/反序列化)。
常见问题/避坑指南
-
数据渲染失败
原因:未做序列化/反序列化,直接操作原始字符串。
解决:服务端必须使用
JSON.stringify,前端接收数据后必须使用JSON.parse。 -
请求阻塞页面
原因:
xhr.open第三个参数设为false,开启了同步请求。解决:固定使用
true开启异步请求,避免主线程阻塞。 -
跨域请求报错
原因:服务端未配置跨域响应头。
解决:本地测试添加
Access-Control-Allow-Origin: *,线上环境禁止使用通配符,指定合法域名。 -
状态判断不严谨
原因:只判断
readyState === 4,忽略status === 200。解决:两个条件必须同时判断,区分「请求完成」和「请求成功」。
-
传输体积过大
原因:生产环境依旧使用
space参数添加缩进格式化。解决:仅开发环境开启缩进,生产环境移除
space参数,使用压缩字符串减少请求体积。