最近在重写我自己的静态博客生成器,虽然遇到的小问题挺多,但今早这个问题令我印象深刻。

发现问题

博客的文章基础数据储存在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的更多相关文章

  1. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  2. JavaScript 基础回顾——数组

    JavaScript是无类型语言,数组元素可以具有任意的数据类型,同一个数组的不同元素可以具有不同类型.数组的元素设置可以包含其他数组,便于模拟创建多维数组. 1.创建数组 在JavaScript中, ...

  3. javascript里面的数组,json对象,动态添加,修改,删除示例

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. javascript中关于数组的一些鄙视题

    一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...

  5. Javascript中判断数组的正确姿势

    在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...

  6. javascript中的数组扩展(一)

     javascript中的数组扩展(一) 随着学习的深入,发现需要学习的关于数组的内容也越来越多,后面将会慢慢归纳,有的是对前面的强化,有些则是关于前面的补充. 一.数组的本质    数组是按照次序排 ...

  7. JavaScript中的数组详解

    JavaScript中的数组 一.数组的定义 数组是值的有序集合,或者说数组都是数据的有序列表. 二.创建数组 [字面量形式] 1.空数组 var arr=[]; 2.带有元素的数组 var arr= ...

  8. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  9. JavaScript移除数组元素减少长度的方法

    JavaScript移除数组元素减少长度的方法,代码如下: //数组移除长度方法 var array=[];  array[0]="张三";  array[1]="李四& ...

  10. JavaScript中对数组的操作

    原文:JavaScript中对数组的操作 一:数组的使用 1.定义:JavaScript中对数组的定义有两种形式.如: .var arr = [12,3,5,8]; .var arr = new Ar ...

随机推荐

  1. Flex相册

    有一个项目用到了Flex,于是抽时间用flex与java做了一个相册,并且添加了上传功能,不过暂时没有针对具体的用户进行存储.下面是图片:  

  2. 2023 ICPC 杭州游记

    题解 省流:三个 NOI 银牌合成一个 ICPC 区域赛银牌 感谢 gjy 的铜钱剑 和 hszx 的大家玩得很开心 两个联赛数据结构没做出来

  3. Devexpress GridControl下拉框实现联动

    实现效果 1.先在设计界面绑定数据列 1.点击设计器 2.绑定数据列 2. 绑定GridView的 FocusedRowChanged事件 //定义两个下拉框 _RIcmbtype:不良分类 _RIc ...

  4. Java并发之原子变量及CAS算法-下篇

    Java并发之原子变量及CAS算法-下篇 概述 本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?.对应Java中的包是:java.util.con ...

  5. CentOS 7 yum无法使用解决方法Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=

    在centos7中使用yum命令时候报错: Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http: ...

  6. ​Spring:IOC(2)

    接前文:Spring:IOC 目录 依赖注入之setter注入 依赖注入之构造器注入 特殊值处理 字面量赋值 null值 xml实体 CDATA节 为类类型属性赋值 为数组类型属性赋值 修改Stude ...

  7. 探索 Nuxt Devtools:功能全面指南

    title: 探索 Nuxt Devtools:功能全面指南 date: 2024/9/3 updated: 2024/9/3 author: cmdragon excerpt: 摘要:本文介绍了Nu ...

  8. (八)Redis 主从复制、切片集群

    一.主从复制 1.主从关系 都说的 Redis 具有高可靠性,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断.AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是将一份数据同时保 ...

  9. Redis入门 - C#|.NET Core封装Nuget包

    经过前面章节的学习,可以说大家已经算Redis开发入门了.已经可以去到项目上磨砺了. 但是今天我还想和大家分享一章:封装自己的Redis C#库,然后打包成Nuget包. 首先要说明的是:不是要自己开 ...

  10. RxJS 系列 – Custom Operator

    前言 虽然 RxJS 提供了非常多的 Operators. 但依然会有不够用的时候. 这时就可以自定义 Operator 了. Operator Is Just a Function Observab ...