JS 中 delete 与 splice 与 循环

2023-11-16

【JS】Array 循环5万数据并删除1万数据,对比Delete与Splice 的运行效果。

已经很晚了,但是,还是把中午实验的东西码上来吧,不然我就可能要忘记了,快点写完,好休息,趁这几天还有激情研究代码,多写点,充实充实自己。

JS 中有 Object 的 delete 语法 Array 也同样适用 而 Array 还有更多的对自己操作的方法,什么splice() shift() pop() ... 嗯,都是可以进行修改数组长度的方法,但其中的效率可真的是没有对比就看不到伤害(cha ju),今天(看时间也是今晚,哦不!明天。。。)这篇文章就为了对一些 需要性能的场景 做一个简单的分析,可谓及其粗暴(jian dan)。还是直接放代码,然后截图最明白了。。。

实例代码

var testArray = [],testArray2=[],testArray3=[];
for(var i=0;i<50000;i++){
//模拟复杂的数据 简单的数据就不要这么搞了,直接用复制的方式比下面这些块的多
	testArray.push({x:1024.1024,y:1024.1024,name:"1024",_this:this,arr:[1024.1024,1024.1024,1024.1024,1024.1024]});
//尽量让两个循环公平些
	testArray2.push({x:1024.1024,y:1024.1024,name:"1024",_this:this,arr:[1024.1024,1024.1024,1024.1024,1024.1024]});
//就让你看看复制有多快 就是用来秒杀上面的
	testArray3.push({x:1024.1024,y:1024.1024,name:"1024",_this:this,arr:[1024.1024,1024.1024,1024.1024,1024.1024]});
}
// 第一个循环开始
var start = Date.now();
var i=0,maxlen =testArray.length,last =maxlen-1 ,delspan=5;//每循环五次后就删除一个

while(i<maxlen){
    if(i%delspan===0){
        testArray[i]=testArray[last];
        delete testArray[last];
        maxlen--;
        last--;
    }else  i++;
}
//实际数组长度没变,只是被删除的都是 undefined 了,只好调一下 Array 的截取方法了 
testArray.splice(last, testArray.length-last);

console.log(Date.now()-start);//打印第一个循环的耗时
// 第二个循环开始
start = Date.now();
i=0;
maxlen=testArray2.length;
while(i<maxlen ){
    if(i%delspan===0) testArray2.splice(i,1);
    i++;
}
console.log(Date.now()-start);//打印第二个循环的耗时

// 以下是后续增加的 用单一的数组试试 就用50万个 1024.1024 这速度你试试就知道了 
// 第三个循环开始 
start = Date.now(); 
var copyTo = [];
i=0;
maxlen=testArray3.length;
while(i<maxlen ){
    if(i%delspan!==0) copyTo.push(testArray3[i]);
    i++;
}
console.log(Date.now()-start);

代码是不是很简单,不简单吗,简单吗,简单的是代码,不简单的是人的想法,非要那么费劲写一个绕来绕去的,结果就是=>放弃吧,我懒得动手,我也懒得活下去。
看下面的 delete 和 splice 运行结果:

console

运行结果
控制台是实践的好地方,它与实际的运行效果差不多,第一个数字 8 是delete循环执行耗时 第二个数字 46 是splice执行的耗时,以上结果是第一次 F12 打开后,输入(粘贴进去)代码运行的结果,后续再输入同样的内容,会因为缓存等其他原因影响执行,鬼知道这是为什么,还是越来越慢,尤其是splice 。看到结果是不是感到又惊喜又怀疑,其实在循环中删除元素是一个不好的写法,但弥补它的方法有很多,还有不做处理,等一个时间点再去独立吧需要删除的移除掉,或者把有用的复制下来。完了,时间不多了,早点休息,才有精力吧工作弄完,才有时间看其他的知识,才有时间去研究代码,才有能力写有用的博客,才有自己幻想的虚空世界(幻想与巧合能产生微妙的力量)。

JS Array 相关连接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
这里也说到了,在循环中做大量的耗时操作并不推荐。
在同样的编程语言中,在循环中修改数组的长度,很容易出现问题,有时候数据并不是要循环的时候就要删除,而是等循环这一步要计算的结果完成了,才对数组做改动(一次性完成),删除操作会引发内存管理器来释放当前变量占用的内存,而释放和获取内存区域的操作是一样的,是会消耗性能的,可不要忘了,尤其是可变长度的类型,Array Object String 等。

扩展延伸 【迭代】 类似死循环

迭代 也是循环的一种

/* 平常版 
一个方法多次调用自身,我先写两个方法相互调用,类似死循环
*/
function fun1(index){
	if(index<10) fun2(index);
}
function fun2(index){
	index++; fun1(index);
}
fun2(0); //开始
 
/* 灵活版 
不要觉得不好就不用,有的功能使用迭代可比循环要好上几倍 案例想要吗?
别急,将来的文章会讲到的。。。 
*/
var fun = function(i,_fun){ 
	i++ ; if(i<10) _fun(i,_fun);
} 
fun(0,fun);//开始

可能有些新人还没尝试这样玩过JS,但有几个月经验的同学一定都玩过,这里,每次进入方法的时候,只要使用了方法区域内的 变量,常量,对象等的声明,一定会创建新的内存索引,且一旦走出循环,内存管理器就开始执行回收释放操作,应为在这个作用域内声明的一切都不可访问,这样就成为内存管理器的执行内存回收的条件之一,除非你把其中声明的内容保存到全局变量中(作用域较为大的,如 window 上)。
说到这个写法,玩过 setTimeoutsetTinterval 的人一定碰到过 在for中的 延时方法中打印当前 index 的操作把 ,粗心的实验:

for(var index=0;index<10;index++) {
	setTimeout(function(){
		console.log(index);
	},200);
}

发现打印结果都是10,咦?什么情况。。。,其实很简单,原因是打印之前,for已经执行完了,而index已经++到10了,所以延时打印出来是这样的结果,整么办呢?方法有很多,最简单的就是换个地方记录下来呗:

for(var index=0;index<10;index++){
	(function(indexs){	
		setTimeout(function(){
			console.log(indexs);
		},200);
	})(index);
}

这就是用了作用域的好处,更多作用域的好处等你发掘。
做的多了就都懂了,如何设计那就天高任鸟飞了,我想整么飞就整么飞,飞太高冻死我也要飞,不体验体验永远不知道高处是怎样的。

其他更有趣的内容敬请期待
未来的方向可能会有:
1.3D 使用 3D max 做好玩的东西出来
2.Three.js 这个强大的 WebGL封装库
3.VTour 插件这个好玩的项目
4.WebSocket 协议 C# 与 JS 即时通讯
5.Canvas 图形碰撞技术
6.。。。 想不到了,啥时候想起来在写吧

如有误导请联系,我会进行修正。
邮箱 hbck_gwx@qq.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 中 delete 与 splice 与 循环 的相关文章

随机推荐

  • 【golang】for range中取地址操作的陷阱

    Tips for range创建了每个元素的副本 而不是直接返回每个元素的引用 例子1 package main import fmt func main slice int 0 1 2 3 myMap make map int int f
  • ZooKeeper之Java客户端API使用—创建节点。

    客户端可以通过ZooKeeper的API来创建一个数据节点 有如下两个接口 String create final String path byte data List
  • LeetCode-1604. 警告一小时内使用相同员工卡大于等于三次的人【哈希表,排序,数组】

    LeetCode 1604 警告一小时内使用相同员工卡大于等于三次的人 哈希表 排序 数组 题目描述 解题思路一 时间转换成分钟数 直接解决跨天问题 用哈希表记录每个员工的名字以及对应的时间 然后遍历哈希表 对于每个员工 我们将该员工的所有
  • 跟我学Java设计模式第7天:行为型设计模式

    Java设计模式文章目录 跟我学Java设计模式第一天 设计模式概述和软件设计原则 跟我学Java设计模式第二天 简单工厂模式 工厂方法模式 抽象工厂模式 跟我学Java设计模式第三天 代理模式 适配器 装饰者等其中模式结构 跟我学Java
  • Qt安装(Windows平台)

    Qt 的安装组件分为两部分 一部分是 Qt 5 9 分类下的 该分类包含的是真正的 Qt 开发库组件 另一部分是 Tools 分类下的 该分类包含的是集成开发环境和编译工具 Qt 5 9 分类下的开发组件 组件 说明 MinGW 5 3 0
  • 【elementplus】解决el-table设置固定高度后,横向滚动条消失的问题

    消失的原因 因为我给el scrollbar bar设置了position static 覆盖了它原本的样式position absolute 解决 把position static删掉
  • hbase region 分配方式

    参与 Region 分配的重要对象 在 Region 分配过程当中 起着重要做用有以下一些对象 安全 HMaster 是 HBase 中的 Master server 仅有一个 HRegionServer 负责多个 HRegion 使之能向
  • Java调用ffmpeg进行视频.H264抽帧,并保存为图片

    Java调用ffmpeg进行视频 H264抽帧 并保存为图片 1 需求 2 解决 3 源码 参考 1 需求 对视频 D data 01 test H264进行抽帧并保存为图片 图片命名为1 jpg 2 jpg 图片保存在D data 01
  • 【华为OD机试】找朋友(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 在学校中 N个小朋友站成一队 第i个小朋友的身高为height i 第i个小朋友可以看到的第
  • 【第六期】人工智能工程师培养计划招生

    前 言 学院第四期课程在2019年10月结课 第一至第四期具有求职意向的同学中 目前已经有80 的同学拿到了国内外名企的AI算法岗位offer 或者国外名校的AI 硕士 全奖博士录取 offer 在大家的认可下 我们开始了第六期的课程 在本
  • (九)kaldi thchs30 三音子模型(line 71-76)

    概览 首先放代码 triphone steps train deltas sh boost silence 1 25 cmd train cmd 2000 10000 data mfcc train data lang exp mono a
  • netty http文件服务器,Netty充当Http服务器简单示例

    Netty的应用场景 RPC 通信框架 长连接服务器 Http服务器 充当Http服务器实例 用户向服务器发送请求 服务器返回给用户Hello World 先介绍几个基础的概念 Channel 通道 相当于一个连接 ChannelHandl
  • Linux TC(Traffic Control) 简介(一)

    众所周知 在互联网诞生之初都是各个高校和科研机构相互通讯 并没有网络流量控制方面的考虑和设计 IP协议的原则是尽可能好地为所有数据流服务 不同的数据流之间是平等的 然而多年的实践表明 这种原则并不是最理想的 有些数据流应该得到特别的照顾 比
  • 关于left join优化not in 导致的长时间查询无数据问题 Using where; Using join buffer (Block Nested Loop)

    一 背景 线上存在业务 需要每天定时整理某个表A未处理的数据 并写入另外一张表B 每天查询出不存在B表中且未处理过的A表数据 A表中的数据主键放入B表中 未设定B表对应索引 数据量初始值大概在几千条 根据网上书籍介绍及多数网友介绍 left
  • 使用LSTM训练分类模型(kreas+tensorflow)

    github链接 https github com fangxiaozhu Classification model 需求描述 基于构建简单的多分类模型需求 使用的是keras深度学习库实现的 实现代码简单可用 模型优点是训练速度快 准确率
  • Latex 报错! Undefined control sequence.

    1 没有添加相应的宏包 2 编译命令不正确 比如应该使用XeLaTex命令却使用了XeTex 3 如果不是上述原因 可以删除 aux文件重新编译 只要代码没问题 命令没问题 突然报错 都可以试试这个方法 亲测有效 XeTeX程序中的命令 用
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • eclipse中mybatis generator插件的安装及使用

    mybatis也能方向生成代码 能方向生成实体类 pojo mapper接口和Mapper接口映射文件 能减少我们代码的工作量 详细步骤如下 1 https github com mybatis generator releases下载or
  • IDEA的一些有点用的插件

    工欲善其事 必先利其器 想知道你和IDEA还差哪些人机合一的插件么 看文章就对了 1 Key Promoter X Key Promoter X 插件 IDEA 快捷键提示工具 在每次我们使用鼠标进行 IDEA 的某个操作 Key Prom
  • JS 中 delete 与 splice 与 循环

    JS Array 循环5万数据并删除1万数据 对比Delete与Splice 的运行效果 已经很晚了 但是 还是把中午实验的东西码上来吧 不然我就可能要忘记了 快点写完 好休息 趁这几天还有激情研究代码 多写点 充实充实自己 JS 中有 O