噢!JavaScript (2):对数组要小心使用delete
最近在重写我自己的静态博客生成器,虽然遇到的小问题挺多,但今早这个问题令我印象深刻。
发现问题
博客的文章基础数据储存在main.json中,其中专门有数组dateindex来储存经过排列后的文章顺序。而今天这个问题就发生在删除文章时对dateindex的处理上。
最开始我使用JavaScript的delete关键字对dateindex内对应文章的元素进行了删除。因为之前我一直习惯这样做,所以也没怎么想这样做的后果。
删除文章的最后一步会对包括dateindex的文章数据使用JSON.stringify()转换为JSON文件格式。
接下来会调用函数renderList(),该函数中首先会利用JSON.parse()将上面的JSON解析为js对象,然后对dateindex数组进行遍历。接着就出错了:
Uncaught TypeError: Cannot read properties of null
看到这个null我立马意识到是dateindex里处理有问题了。试了几次发现都是这样,回去检查代码才发现:这个delete对于数组一定要谨慎使用。
怎么回事呢
这一节举个例子来说明~

let arr=[[1],[2],[3],[4],[5]];
delete arr[2];
上面这段代码中我尝试用delete删除了arr的下标为2的元素,我们试着输出一下处理后的数组:
console.log(arr); // > (5) [[1], [2], 空, [4], [5]]
很明显已经有不对劲的地方了,虽然用delete删除了元素内容,但数组长度并没有变化,下标为2的元素相当于被架空了(undefined)。
arr.forEach(v=>console.log(v[0])) // 1 2 4 5
此时使用forEach没有问题,会自动跳过“空元素”,但如果经过JSON方法处理一道情况就不同了:
json=JSON.stringify(arr);
arr2=JSON.parse(json);
console.log(arr2); // > (5) [[1], [2], null, [4], [5]]
因为数组长度未变,空元素在JSON中被记录为了null,而重新解析为JavaScript对象时也就自然而然变成null了,这个时候再进行循环就不会忽略了:
arr2.forEach((v)=>console.log(v[0]))
/*
1
2
Uncaught TypeError: Cannot read properties of null (reading '0')
*/
这便是问题所在。
替代方法
JavaScript数组原型链上还有一个方法splice(开始下标[,删除数量[,填补元素...]])。
该方法对于数组也是原地操作,并且数组的长度会被改变。因此直接用
arr.splice(2,1);
代替delete arr[2]即可。
教训
虽然Array在JavaScript里也属于对象,但是数组是有序序列,是特殊的对象,在使用delete这种针对对象的关键字时一定要多了解一下产生的后果(有点开地图炮的感觉)。
最好不要随便在数组上使用delete。
噢!JavaScript (2):对数组要小心使用delete的更多相关文章
- 前端开发:Javascript中的数组,常用方法解析
前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...
- JavaScript 基础回顾——数组
JavaScript是无类型语言,数组元素可以具有任意的数据类型,同一个数组的不同元素可以具有不同类型.数组的元素设置可以包含其他数组,便于模拟创建多维数组. 1.创建数组 在JavaScript中, ...
- javascript里面的数组,json对象,动态添加,修改,删除示例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- javascript中关于数组的一些鄙视题
一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...
- Javascript中判断数组的正确姿势
在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...
- javascript中的数组扩展(一)
javascript中的数组扩展(一) 随着学习的深入,发现需要学习的关于数组的内容也越来越多,后面将会慢慢归纳,有的是对前面的强化,有些则是关于前面的补充. 一.数组的本质 数组是按照次序排 ...
- JavaScript中的数组详解
JavaScript中的数组 一.数组的定义 数组是值的有序集合,或者说数组都是数据的有序列表. 二.创建数组 [字面量形式] 1.空数组 var arr=[]; 2.带有元素的数组 var arr= ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- JavaScript移除数组元素减少长度的方法
JavaScript移除数组元素减少长度的方法,代码如下: //数组移除长度方法 var array=[]; array[0]="张三"; array[1]="李四& ...
- JavaScript中对数组的操作
原文:JavaScript中对数组的操作 一:数组的使用 1.定义:JavaScript中对数组的定义有两种形式.如: .var arr = [12,3,5,8]; .var arr = new Ar ...
随机推荐
- 【客户案例】白鲸开源WhaleStudio助力某证券公司打造全面数据解决方案:探析DataOps平台革新与应用
背景 近年来随着国际形势的变化,信创产业成为我国国家战略的一部分.一直以来,一直以来,全球 ICT 产业底层标准.架构.产品.生态等要素均由国外公司或机构制定和控制,使我国 ICT 产业乃至广大用户面 ...
- 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)
2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u1 热҈热҈热҈ #include<bits/stdc++.h> using namespace std; us ...
- SMU Summer 2023 Contest Round 1
SMU Summer 2023 Contest Round 1 A. The Contest 当 \(m\) 为 \(0\) 和 完成时间大于最后一个时刻时,说明都无法在规定条件内完成,输出\(-1\ ...
- protostuff序列化接口封装
1.pom <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId> ...
- visual studio安装MFC模板
计算机图形学 奇怪的重点 需要单击选中使用C++的桌面开发 才会跳出右侧的选项 要么就是展开右侧的收缩
- history的replace("/admin")与("admin")的区别
假设当前路由为:localhost:3000/index/a 有"/"的情况是直接从根目录替换 改完之后的路由为:localhost:3000/admin 没有"/&qu ...
- Java基础 韩顺平老师的 泛型 的部分笔记
553,泛型引入 package com.hspedu.list_; import java.util.*; import java.util.concurrent.CompletionService ...
- 搜索组件优化 - Command ⌘K
前言: DevNow 项目中我们使用了 DocSearch 来实现搜索功能,但是由于有以下的限制: 您的网站必须是技术文档或技术博客. 您必须是网站的所有者,或者至少具有更新其内容的权限 您的网站必须 ...
- angular 知识
看完以下内容应该就可以上手Angular了 https://angular.io/start Udemy - Complete Angular 14 Course - Learn Frontend D ...
- PicGo RequestError: Error: tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:36677
PicGo RequestError: Error: tunneling socket could not be established, cause=connect ECONNREFUSED 127 ...