可能是本年度最后一篇文章了,记录下最近在项目中使用到的一些 js 知识点。近期大量使用出现很多很诡异的问题,还是蛮 shock 的,不过也算是学到了很多东西。
没有代码检测,不用初始话定义变量,直接使用也不会报错,这个太难了。
1. 循环
除了正常的 for 循环,还有 for…in 循环和 for…of 循环,这谁能想到呢。
在 JavaScript 中,for…in 循环遍历对象的可枚举属性。对于数组,遍历的是数组索引,而不是数组元素。所以,当你在数组上使用 for…in 循环时,element 是数组的索引,而不是数组的元素。
在你的代码中:
for (let element in healthCsvResult.Items) { |
element 是 healthCsvResult.Items 数组的索引。如果你想要数组的元素,你应该使用数组的索引来获取元素:
for (const index in healthCsvResult.Items) { |
或者,你可以使用 for…of 循环,它直接遍历数组的元素:
for (const element of healthCsvResult.Items) { |
请注意,for…in 和 for…of 有一些重要的区别。for…in 遍历对象的可枚举属性,包括原型链上的属性。for…of 遍历可迭代对象的元素,不包括原型链上的属性。对于数组,通常应该使用 for…of 循环。
2. 拷贝
看 ai 解释了一大段还是没感觉,目前用的是 JSON.parse(JSON.stringify())
,这个方法可以用来创建一个对象的深拷贝。
Object.assign({}, healthCsvResult)
和 JSON.parse(JSON.stringify(healthCsvResult))
都可以用来创建一个对象的深拷贝。但是,它们在处理某些类型的数据时有一些重要的区别。
Object.assign({}, healthCsvResult): 这种方法实际上只创建了一个浅拷贝。也就是说,如果
healthCsvResult
的属性是对象或数组,那么新对象将共享这些属性的引用。如果你修改了这些属性,原始对象和新对象都会受到影响。JSON.parse(JSON.stringify(healthCsvResult)): 这种方法创建了一个深拷贝,即新对象的所有属性都是原始对象属性的副本,不共享任何引用。但是,这种方法有一些限制:
- 它不能处理函数和
undefined
,这些值会在序列化过程中被忽略。 - 它不能处理循环引用,如果对象引用自身,这将导致错误。
- 它不能处理特殊的对象,如
Date
、RegExp
、Map
、Set
等,这些对象会被转换为普通对象或丢失。
- 它不能处理函数和
所以,选择哪种方法取决于你的具体需求。如果你需要一个完全独立的副本,并且你的对象只包含 JSON 可以处理的数据类型,那么 JSON.parse(JSON.stringify())
是一个好选择。如果你的对象包含函数、undefined
或特殊对象,或者你只需要一个浅拷贝,那么 Object.assign()
可能更适合。