【JavaScript】week9-summary

作者:mario 发布时间: 2026-08-26 阅读量:4 评论数:0

第 9 周总结:对象、数组与 JSON — 让数据"有结构"

蜗牛往上爬 · 前端工业可视化学习笔记 第 9 周总结
本周掌握了 JS 最重要的两种数据结构:用对象建模"一台设备",用数组管理"一批设备",用高阶方法做数据处理流水线,用 JSON 完成数据传输的序列化。这些都是工业大屏天天要用的核心能力。


目录


一、本周学了什么

天数

主题

核心知识点

产出

Day 1-2

对象

字面量、读写删、in 检查、for…in、方法中的 this、引用类型

设备对象建模

Day 3-4

数组基础

对象数组、push/pop/shift/unshift、splice、indexOf/slice/concat/join/reverse

数组练习 15 题

Day 5-6

高阶方法与 JSON

forEach/map/filter/reduce、链式调用、JSON.stringify/parse、数据清洗

数据清洗流水线

知识图谱

对象、数组与 JSON
├── 对象
│   ├── 字面量 { key: value }(值可嵌套对象/数组/函数)
│   ├── 读写:点语法 / 方括号(变量 key 必须用方括号)
│   ├── 删除:delete / 检查:in、hasOwnProperty
│   ├── 遍历:for...in(obj[key] 不是 obj.key)
│   ├── this:方法中指向对象本身
│   └── 引用类型:赋值传地址、=== 比地址
│
├── 数组
│   ├── 对象数组(大屏核心数据结构)
│   ├── 增删:push/pop(尾)、unshift/shift(头)
│   ├── splice:删/插/替换三合一
│   ├── 查找:indexOf(-1 表示不存在)
│   └── 不改原数组:slice/concat/join
│
├── 高阶方法
│   ├── forEach(遍历做事)
│   ├── map(一对一转换)
│   ├── filter(筛选)
│   ├── reduce(聚合:求和/平均/统计)
│   └── 链式调用:filter → map → reduce
│
└── JSON
    ├── stringify(对象 → 字符串,发数据)
    ├── parse(字符串 → 对象,收数据)
    ├── 规则:双引号、无函数、无尾逗号
    └── parse 必须 try/catch

二、核心知识速记

三条铁律

  1. 对象是引用类型——赋值传地址,{a:1} === {a:1} 是 false

  2. for…in 必须用 obj[key]——obj.key 会去找名为 “key” 的属性

  3. filter/map/reduce 都不改原数组——放心链式调用

高阶方法选型口诀

需求

方法

遍历做事

forEach

转换每个元素

map

筛选部分元素

filter

算出一个结果

reduce

在工业可视化里的应用场景

知识点

应用场景

对象建模

一台设备的属性(id/temp/status/location)

对象数组

设备列表、传感器数据、告警记录

map

提取图表需要的数据(id 数组、温度数组)

filter

筛选在线设备、高温设备、某车间设备

reduce

统计平均温度、各状态数量、告警总数

JSON.stringify

把设备数据发给后端

JSON.parse

解析后端 API 返回的数据

数据清洗

原始数据 → filter → map → 图表数据


三、本周踩过的坑

坑点 1:for…in 用了 obj.key

// ❌ device.key 会去找名为 "key" 的属性 → undefined
for (var key in device) {
  console.log(device.key);
}

// ✅ key 是变量,必须用方括号
for (var key in device) {
  console.log(device[key]);
}

坑点 2:忽略引用类型,误改了原数据

// ❌ backup 和 original 指向同一个对象
var original = { temp: 65 };
var backup = original;
backup.temp = 100;
console.log(original.temp);  // 100 ⚠

// ✅ 需要拷贝时用 JSON(简单但只适用于纯数据)
var backup = JSON.parse(JSON.stringify(original));
backup.temp = 100;
console.log(original.temp);  // 65 ✅

坑点 3:splice 删除前没检查下标

// ❌ indexOf 返回 -1 时,splice(-1, 1) 会删掉最后一个元素!
var devices = ["A", "B", "C"];
devices.splice(devices.indexOf("X"), 1);  // 删掉了 "C"!
// splice(-1, 1) 表示"从倒数第一个删一个"

// ✅ 先判断再删
var index = devices.indexOf("X");
if (index !== -1) {
  devices.splice(index, 1);
}

坑点 4:map 回调忘记 return

// ❌ 忘记 return,新数组全是 undefined
var temps = deviceList.map(function (device) {
  device.temp;  // 没有 return!
});
console.log(temps);  // [undefined, undefined, ...]

// ✅ map/filter 的回调必须 return
var temps = deviceList.map(function (device) {
  return device.temp;
});

坑点 5:JSON.parse 没有容错

// ❌ 非法 JSON 直接抛错,页面崩溃
var data = JSON.parse(response);  // response 格式错就完蛋

// ✅ 必须 try/catch
var data;
try {
  data = JSON.parse(response);
} catch (error) {
  data = null;
  console.error("数据解析失败");
}

四、自测清单

  • [ ] 如何用对象字面量描述一台设备(含嵌套和数组)?

  • [ ] 属性名是变量时,用点语法还是方括号?

  • [ ] for…in 遍历时怎么访问属性值?

  • [ ] 对象赋值给另一个变量后修改,原对象会变吗?为什么?

  • [ ] push/pop 和 unshift/shift 分别操作数组的哪一端?

  • [ ] splice 的三个参数分别是什么?

  • [ ] indexOf 找不到元素时返回什么?splice 这个值会怎样?

  • [ ] 哪些数组方法改原数组?哪些不改?

  • [ ] map 的回调忘记 return 会怎样?

  • [ ] 四大高阶方法各自的返回值是什么?

  • [ ] 用 reduce 统计"各状态设备数量",初始值设什么?

  • [ ] JSON 和 JS 对象有哪些区别?

  • [ ] JSON.parse 为什么要 try/catch?


五、下周预告

第 10 周:原型、DOM 与事件(JS 基础收官周)

天数

主题

Day 1-2

原型与继承(构造函数、new、原型链)

Day 3-4

DOM 与事件(选择元素、增删节点、事件监听、冒泡)

Day 5-6

异常处理 + 综合项目"设备清单增删改查"

下周是 JS 基础的收官周。学完 DOM 和事件,JS 就能真正操作网页了——阶段0 做的大屏终于可以"动"起来。收官项目是"设备清单增删改查"页面,它会用到前 4 周学的所有知识。


🚀 第 9 周完成!数据结构齐了,下周让 JS "看见"页面、操作页面!

评论