告别数据混乱!掌握JSON与内置对象,让你的JS代码更专业

作者:良山有风来日期:2025/10/20

你是不是也有过类似的经历?

  • 后端返回的数据看起来正常,但JS就是解析不了
  • 日期显示成一串看不懂的数字,还得手动转换
  • 处理复杂数据时写了无数循环,代码又长又难维护
  • 本地存储数据后再读取,发现格式全乱了

别担心,今天我就带你彻底掌握JSON和JS内置对象的使用技巧。学完这篇文章,你不仅能轻松解决这些问题,还能写出更优雅、更专业的数据处理代码!

JSON:数据交换的"普通话"

想象一下,你要跟一个外国朋友交流,但他说法语,你说中文,完全没法沟通怎么办?这时候就需要一种"通用语言"。

在编程世界里,JSON就是这种"通用语言"。它让前端、后端、移动端都能顺畅地"对话"。

JSON基础:比你想的还要简单

JSON说白了就是一种特殊格式的字符串,但它的规则超级严格:

1// 正确的JSON格式
2{
3  "name": "张三",
4  "age": 25,
5  "isStudent": false,
6  "hobbies": ["篮球", "编程", "音乐"],
7  "address": {
8    "city": "北京",
9    "district": "海淀区"
10  }
11}
12
13// 常见的错误写法
14{
15  name: "张三",        // 错误:属性名必须用双引号
16  'age': 25,          // 错误:必须用双引号,不能用单引号
17  isStudent: false,   // 错误:属性名没加引号
18  hobbies: ["篮球", "编程", "音乐"]  // 错误:属性名没加引号
19}
20

看到区别了吗?JSON的规则就是这么"死板",但正是这种严格保证了数据的一致性。

JSON的实战用法:不只是stringify和parse

你以为JSON就两个方法?那可就太小看它了!

1// 场景1:深拷贝对象的完美方案
2const originalObj = {
3  name: "李四",
4  scores: [90, 85, 95],
5  profile: {
6    height: 180,
7    weight: 70
8  }
9};
10
11// 常用的浅拷贝有问题
12const shallowCopy = {...originalObj};
13shallowCopy.profile.height = 190; // 这会修改原对象!
14
15// 用JSON实现深拷贝
16const deepCopy = JSON.parse(JSON.stringify(originalObj));
17deepCopy.profile.height = 190; // 原对象不受影响
18console.log(originalObj.profile.height); // 还是180,完美!
19
20// 场景2:数据验证 - 确保拿到的是有效JSON
21function safeParse(jsonString) {
22  try {
23    return JSON.parse(jsonString);
24  } catch (error) {
25    console.log('JSON格式错误,返回默认值');
26    return {};
27  }
28}
29
30// 这样就不怕后端返回异常数据了
31const badData = "{name: '王五'}"; // 缺少引号的错误JSON
32const goodData = safeParse(badData); // 不会报错,返回空对象
33
34// 场景3:格式化显示,调试更轻松
35const complexData = {
36  users: [
37    {id: 1, name: "用户1", permissions: ["read", "write"]},
38    {id: 2, name: "用户2", permissions: ["read"]}
39  ]
40};
41
42// 第三个参数是缩进空格数,让输出更美观
43console.log(JSON.stringify(complexData, null, 2));
44

内置对象:JS自带的"瑞士军刀"

如果说JSON是数据交换的工具,那内置对象就是数据处理的多功能工具箱。每个都有独特的本领,用对了能让你的代码效率翻倍!

Date对象:告别时间处理的头疼

时间处理是前端最常见的需求,也是最容易出bug的地方。

1// 创建日期对象的多种方式
2const now = new Date(); // 当前时间
3const specificDate = new Date('2024-03-20'); // 特定日期
4const timestamp = new Date(1647763200000); // 通过时间戳
5
6// 实战:格式化日期显示
7function formatDate(date) {
8  const year = date.getFullYear();
9  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,要+1
10  const day = String(date.getDate()).padStart(2, '0');
11  
12  return `${year}-${month}-${day}`;
13}
14
15// 用法示例
16const today = new Date();
17console.log(formatDate(today)); // "2024-03-20"
18
19// 更实用的:相对时间显示
20function getRelativeTime(time) {
21  const now = new Date();
22  const diffInMs = now - time;
23  const diffInMinutes = Math.floor(diffInMs / (1000 * 60));
24  const diffInHours = Math.floor(diffInMs / (1000 * 60 * 60));
25  const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));
26  
27  if (diffInMinutes < 1) return '刚刚';
28  if (diffInMinutes < 60) return `${diffInMinutes}分钟前`;
29  if (diffInHours < 24) return `${diffInHours}小时前`;
30  if (diffInDays < 7) return `${diffInDays}天前`;
31  
32  return formatDate(time);
33}
34
35// 测试相对时间
36const testTime = new Date(Date.now() - 2 * 60 * 60 * 1000); // 2小时前
37console.log(getRelativeTime(testTime)); // "2小时前"
38

Math对象:数学计算不用愁

Math对象提供了一整套数学工具,很多开发者却只用了Math.random()。

1// 实用技巧1:生成指定范围的随机数
2function getRandomInRange(min, max) {
3  return Math.floor(Math.random() * (max - min + 1)) + min;
4}
5
6// 生成6位数字验证码
7const verificationCode = getRandomInRange(100000, 999999);
8console.log(verificationCode); // 比如:384756
9
10// 实用技巧2:数值限制在范围内
11function clamp(value, min, max) {
12  return Math.min(Math.max(value, min), max);
13}
14
15// 页面滚动进度计算
16const scrollProgress = clamp(window.scrollY / document.body.scrollHeight, 0, 1);
17console.log(scrollProgress); // 永远在0-1之间
18
19// 实用技巧3:小数精度处理
20const price = 19.899999;
21console.log(price.toFixed(2)); // "19.90" - 自动四舍五入
22
23// 但toFixed返回的是字符串,需要转数字
24const cleanPrice = Number(price.toFixed(2));
25console.log(cleanPrice); // 19.9
26

String对象:文本处理的艺术

字符串处理是日常开发的重头戏,掌握这些技巧能省下大量时间。

1// 现代JS字符串处理技巧
2const text = "  Hello, JavaScript世界!  ";
3
4// 1. 去除空格的新方法
5console.log(text.trim()); // "Hello, JavaScript世界!"
6
7// 2. 检查字符串包含关系
8console.log(text.includes("JavaScript")); // true
9console.log(text.startsWith("  Hello")); // true
10console.log(text.endsWith("世界!  ")); // true
11
12// 3. 字符串填充,适合显示对齐
13const number = "25";
14console.log(number.padStart(4, "0")); // "0025"
15console.log(number.padEnd(4, "0"));   // "2500"
16
17// 实战:关键词高亮函数
18function highlightKeywords(text, keywords) {
19  let result = text;
20  
21  keywords.forEach(keyword => {
22    const regex = new RegExp(`(${keyword})`, 'gi');
23    result = result.replace(regex, '<mark>$1</mark>');
24  });
25  
26  return result;
27}
28
29// 使用示例
30const article = "JavaScript是一种强大的编程语言,学习JavaScript很有趣";
31const highlighted = highlightKeywords(article, ["JavaScript", "编程"]);
32console.log(highlighted);
33// "<mark>JavaScript</mark>是一种强大的<mark>编程</mark>语言,学习<mark>JavaScript</mark>很有趣"
34

实战案例:构建一个完整的数据处理工具

光说不练假把式,我们来写一个真实可用的数据处理工具。

1class DataProcessor {
2  constructor() {
3    this.cache = new Map(); // 用Map做缓存,比普通对象更合适
4  }
5  
6  // 处理API返回的数据
7  processApiResponse(apiData) {
8    try {
9      // 1. 深拷贝原始数据
10      const data = JSON.parse(JSON.stringify(apiData));
11      
12      // 2. 处理日期字段
13      if (data.createTime) {
14        data.createTime = new Date(data.createTime);
15        data.formattedTime = this.formatDate(data.createTime);
16      }
17      
18      // 3. 处理数字字段
19      if (data.price) {
20        data.formattedPrice = [`¥${Number(data.price).toFixed(2)}`](https://xplanc.org/primers/document/zh/03.HTML/EX.HTML%20%E5%85%83%E7%B4%A0/EX.data.md);
21      }
22      
23      // 4. 缓存处理结果
24      this.cache.set(apiData.id, data);
25      
26      return data;
27    } catch (error) {
28      console.error('数据处理失败:', error);
29      return null;
30    }
31  }
32  
33  // 格式化日期
34  formatDate(date) {
35    const now = new Date();
36    const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
37    const targetDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
38    
39    const diffTime = targetDate - today;
40    const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
41    
42    if (diffDays === 0) return '今天';
43    if (diffDays === 1) return '明天';
44    if (diffDays === -1) return '昨天';
45    
46    return [`${date.getMonth() + 1}${date.getDate()}`](https://xplanc.org/primers/document/zh/10.Bash/90.%E5%B8%AE%E5%8A%A9%E6%89%8B%E5%86%8C/EX.date.md);
47  }
48  
49  // 生成唯一ID
50  generateId(prefix = 'item') {
51    const timestamp = Date.now().toString(36);
52    const randomStr = Math.random().toString(36).substr(2, 5);
53    return `${prefix}_${timestamp}_${randomStr}`;
54  }
55}
56
57// 使用示例
58const processor = new DataProcessor();
59
60// 模拟API数据
61const mockApiData = {
62  id: 1,
63  title: "JavaScript高级程序设计",
64  price: 89.9,
65  createTime: "2024-03-19T10:30:00Z",
66  tags: ["编程", "前端", "JavaScript"]
67};
68
69const processedData = processor.processApiResponse(mockApiData);
70console.log(processedData);
71// 输出:
72// {
73//   id: 1,
74//   title: "JavaScript高级程序设计", 
75//   price: 89.9,
76//   createTime: Date对象,
77//   formattedTime: "昨天",
78//   formattedPrice: "¥89.90",
79//   tags: ["编程", "前端", "JavaScript"]
80// }
81

避坑指南:这些错误千万别犯!

在实际项目中,我见过太多因为不了解细节而导致的bug:

1// 坑1:JSON不能处理undefined和函数
2const problemObj = {
3  name: "测试",
4  method: function() { console.log('hello'); }, // 函数会被忽略
5  undefinedField: undefined // undefined会被忽略
6};
7
8console.log(JSON.stringify(problemObj)); 
9// 输出:{"name":"测试"} - 函数和undefined都没了!
10
11// 坑2:日期对象序列化会变成字符串
12const dateObj = { createTime: new Date() };
13const serialized = JSON.stringify(dateObj);
14console.log(serialized); // {"createTime":"2024-03-20T03:45:30.123Z"}
15const parsed = JSON.parse(serialized);
16console.log(parsed.createTime instanceof Date); // false!变成了字符串
17
18// 解决方案:使用reviver函数
19const fixedParse = JSON.parse(serialized, (key, value) => {
20  if (typeof value === 'string' && 
21      /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) {
22    return new Date(value);
23  }
24  return value;
25});
26console.log(fixedParse.createTime instanceof Date); // true!
27
28// 坑3:数字精度问题
29console.log(0.1 + 0.2 === 0.3); // false!
30console.log(0.1 + 0.2); // 0.30000000000000004
31
32// 解决方案:使用toFixed或者乘以10的倍数
33function safeAdd(num1, num2) {
34  const multiplier = Math.pow(10, 10); // 根据精度需求调整
35  return (num1 * multiplier + num2 * multiplier) / multiplier;
36}
37console.log(safeAdd(0.1, 0.2) === 0.3); // true!
38

进阶技巧:让代码更优雅的秘诀

当你掌握了基础之后,来看看这些让代码更专业的技巧:

1// 技巧1:使用Object.entries和Object.fromEntries
2const user = {
3  name: "张三",
4  age: 25,
5  city: "北京"
6};
7
8// 过滤出年龄大于20的属性
9const filtered = Object.fromEntries(
10  Object.entries(user).filter(([key, value]) => {
11    if (key === 'age') return value > 20;
12    return true;
13  })
14);
15console.log(filtered); // {name: "张三", age: 25, city: "北京"}
16
17// 技巧2:使用Map代替对象作为字典
18// 普通对象的键只能是字符串,Map可以是任意类型
19const complexKey = { id: 1 };
20const myMap = new Map();
21myMap.set(complexKey, "对应的值");
22console.log(myMap.get(complexKey)); // "对应的值"
23
24// 技巧3:使用Set数组去重
25const duplicateArray = [1, 2, 2, 3, 4, 4, 5];
26const uniqueArray = [...new Set(duplicateArray)];
27console.log(uniqueArray); // [1, 2, 3, 4, 5]
28

总结与思考

今天我们一起深入探索了JSON和JS内置对象的强大能力。从基础用法到实战技巧,从常见坑点到进阶方法,希望这些内容能真正帮到你。


告别数据混乱!掌握JSON与内置对象,让你的JS代码更专业》 是转载文章,点击查看原文


相关推荐


Java 怎么学习Kubernetes
自由的疯2025/10/19

学习 Kubernetes 可以是一项挑战,但也非常值得投入时间和精力,因为它在现代软件开发和运维中扮演着至关重要的角色。以下是一条结构化的学习路径,帮助你从零开始学习 Kubernetes,直至掌握其核心概念和实践技能。 1. 基础知识准备 1.1 了解容器技术 Docker:学习 Docker 是开始 Kubernetes 学习之旅的第一步。了解如何创建和管理容器,熟悉 Dockerfile 和 Docker Compose 的使用。 容器基础概念:理解容器与虚拟机的区别,了解容器的生命周


量子纠错(Quantum Error Correction, QEC)
deepdata_cn2025/10/17

量子纠错(QEC)是突破量子计算实用化瓶颈的核心技术,其本质是通过特殊编码和算法抵消量子比特的固有不稳定性,为容错量子计算奠定基础。从实验室的原理验证到特定领域的原型应用,量子纠错正逐步从理论走向实践,成为连接量子硬件与实用场景的关键桥梁。 一、量子纠错的核心价值 量子比特与经典比特最大的区别在于其脆弱性。经典比特的0和1状态稳定,而量子比特依赖叠加态(如|ψ⟩=α|0⟩+β|1⟩)和纠缠态存在,极易受环境干扰(如温度波动、电磁辐射、控制噪声)出现错误,即“退相干”——量子态会在微秒至毫秒级


嵌入式硬件——基于IMX6ULL的I2C实现
眰恦ゞLYF2025/10/16

一、I2C 基础概念与硬件特性 1.1 I2C 总线核心定义 I2C(Inter-Integrated Circuit)是飞利浦提出的串行半双工通信总线,核心特点是两根信号线实现多设备互联: SDA(Serial Data):双向数据线,用于传输数据;SCL(Serial Clock):双向时钟线,由主设备产生,同步数据传输;上拉电阻:SDA 和 SCL 需外接(或引脚内部配置)上拉电阻(通常 4.7KΩ),空闲时保持高电平;主从架构:同一总线中仅 1 个主设备(如 I.MX6ULL),可


企业级 K8s 深度解析:从容器编排到云原生基石的十年演进
我的offer在哪里2025/10/14

引言:为什么 K8s 成为企业数字化的 "必选项" 2024 年 6 月,Kubernetes(简称 K8s)迎来了诞生十周年的里程碑。十年前,Google 工程师在 GitHub 上提交的第一行代码,如今已成长为全球最大的开源项目之一 —— 拥有来自 8000 多家公司、44 个国家的 88000 名贡献者,以及超过 700 万开发者组成的庞大社区。在企业战场,这个用 "8" 代替 "ubernete" 七个字符的技术名词,早已不是单纯的技术工具,而是支撑数字化转型的核心基础设施。 根据《


Go语言实战案例——进阶与部署篇:性能优化与 pprof 性能分析实践
程序员爱钓鱼2025/10/13

在实际开发中,当 Go 服务上线后,性能问题往往成为系统稳定性的关键因素。 有时是 CPU 占用过高,有时是内存泄漏,也可能是请求响应变慢。 要解决这些问题,不能仅依靠直觉,而应借助可靠的工具进行性能分析与定位。 Go 官方提供的 pprof 工具,正是性能分析的利器。 本文将通过一个完整的案例,带你了解如何在 Go 项目中使用 pprof 进行性能采样、分析瓶颈并进行优化。 一 为什么需要性能分析 在高并发或长时间运行的 Go 程序中,性能问题往往难以肉眼察觉。 常见问题包括: 1 CPU


用搬家公司的例子来入门webpack
颜酱2025/10/11

📚 官方文档:Webpack 官网 | Webpack 中文文档 🚀 实践项目:webpack-simple-demo - 本文档的完整示例项目 Webpack 主要是干什么的? Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(static module bundler)。简单来说,它就是把你的项目中的各种文件(TS、Less、JS、CSS、图片等)打包成一个或多个浏览器可以直接使用的文件。特别像搬家公司,把你的东西打包进各种盒子里。 英文中"bundle"意为


ASM1042芯片在汽车BCM项目的工程化应用探索
国科安芯2025/10/10

摘要 随着汽车产业的快速发展,车身控制模块(BCM)作为汽车电子系统的核心组件之一,对芯片的性能、可靠性和适应性提出了更高的要求。本文综合分析了国科安芯推出的ASM1042芯片的技术特性、可靠性测试结果以及实际应用案例,结合汽车BCM项目的需求背景,系统性地探讨了ASM1042芯片在汽车电子领域的工程化应用潜力。通过对芯片性能的深度剖析以及实际应用中的挑战与解决方案的详细阐述,本文旨在为汽车电子系统的设计与优化提供参考,同时推动高性能通信芯片在汽车领域的广泛应用。 一、引言 在现代汽车架构


dep.ts 逐行解读
excel2025/10/8

简化归纳 一、导入与上下文说明(开头几行) import { extend, isArray, isIntegerKey, isMap, isSymbol } from '@vue/shared' import type { ComputedRefImpl } from './computed' import { type TrackOpTypes, TriggerOpTypes } from './constants' import { type DebuggerEventExtraInf


[特殊字符]️ Spring Cloud Eureka 三步通:搭建注册中心 + 服务注册 + 服务发现,通俗易懂!
绝顶少年2025/10/7

📌 引言:什么是服务注册与发现? 在微服务架构中,我们通常会将一个大型系统拆分成多个小服务,比如: 用户服务(user-service) 订单服务(order-service) 支付服务(payment-service) 这些服务可能会​​相互调用​​,比如订单服务要查询用户信息,就需要调用用户服务。 但问题来了:​​订单服务怎么知道用户服务在哪里(IP + 端口)?​​ 👉 ​​这就是服务注册与发现要解决的问题!​​ 🤖 什么是 Eureka? ​​E


最新版 Python 的内置函数大全
IMPYLH2025/10/5

Python 的内建函数 Python 提供了大量开箱即用的内置函数,这些函数就像是你编程工具箱中的瑞士军刀——小巧但功能强大,随时准备帮你解决各种编程挑战。从简单的数据转换到复杂的迭代操作,内置函数都能让我们的代码更加简洁、优雅和高效。 无论你是刚刚踏入编程大门的新手,还是希望提升编码效率的资深开发者,掌握Python内置函数都将为你的编程之旅带来质的飞跃。 让我们放下繁琐的重复代码,拥抱Python内置函数带来的简洁与力量。 Python 3.13 共计 71 个内置函数,以下按字母

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0