0%

javascript 使用

可能是本年度最后一篇文章了,记录下最近在项目中使用到的一些 js 知识点。近期大量使用出现很多很诡异的问题,还是蛮 shock 的,不过也算是学到了很多东西。

没有代码检测,不用初始话定义变量,直接使用也不会报错,这个太难了。

1. 循环

除了正常的 for 循环,还有 for…in 循环和 for…of 循环,这谁能想到呢。
在 JavaScript 中,for…in 循环遍历对象的可枚举属性。对于数组,遍历的是数组索引,而不是数组元素。所以,当你在数组上使用 for…in 循环时,element 是数组的索引,而不是数组的元素。

在你的代码中:

for (let element in healthCsvResult.Items) {
console.log(element);
}

element 是 healthCsvResult.Items 数组的索引。如果你想要数组的元素,你应该使用数组的索引来获取元素:

for (const index in healthCsvResult.Items) {
const element = healthCsvResult.Items[index];
// ...
}

或者,你可以使用 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)) 都可以用来创建一个对象的深拷贝。但是,它们在处理某些类型的数据时有一些重要的区别。

  1. Object.assign({}, healthCsvResult): 这种方法实际上只创建了一个浅拷贝。也就是说,如果 healthCsvResult 的属性是对象或数组,那么新对象将共享这些属性的引用。如果你修改了这些属性,原始对象和新对象都会受到影响。

  2. JSON.parse(JSON.stringify(healthCsvResult)): 这种方法创建了一个深拷贝,即新对象的所有属性都是原始对象属性的副本,不共享任何引用。但是,这种方法有一些限制:

    • 它不能处理函数和 undefined,这些值会在序列化过程中被忽略。
    • 它不能处理循环引用,如果对象引用自身,这将导致错误。
    • 它不能处理特殊的对象,如 DateRegExpMapSet 等,这些对象会被转换为普通对象或丢失。

所以,选择哪种方法取决于你的具体需求。如果你需要一个完全独立的副本,并且你的对象只包含 JSON 可以处理的数据类型,那么 JSON.parse(JSON.stringify()) 是一个好选择。如果你的对象包含函数、undefined 或特殊对象,或者你只需要一个浅拷贝,那么 Object.assign() 可能更适合。