转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
JS 中创建给定长度的数组
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [wayou.github.io](https://wayou.github.io/2018/12/25/JS-%E4%B8%AD%E5%88%9B%E5%BB%BA%E7%BB%99%E5%AE%9A%E9%95%BF%E5%BA%A6%E7%9A%84%E6%95%B0%E7%BB%84/) 最佳直观的方式莫非使用字面量。 缺点很明显,元素多的时候就捉襟见肘了。我们需要更加便捷地创建给定长度的数组。 首先了解下,数组以数组的形式存在时,其存储和读取是非常高效的,也就是说,数组还有以非数组的形式存在的情况。 与其他语言中数组是连续元素组成的数据类型不同,JS 中数组序列中是允许存在间隔,即数组中可以有「洞」。 ``` const arr = [1,2,3]; ``` 注意这里之所以说数组存在洞,而不是说空的地方是 `undefined`,是因为 `undefined` 是实实在在的数据类型,而数组中存在洞的地方,其并不是被初始化了一个实实在在的 `undefined`,而是只有我们在访问的时候,才得到了一个确切的 `undefined` 值。联想薛定谔的猫。 此时 V8 引擎中其不是以数组形式存在,而是一个以数字为键的键值对。对该数据的操作是没有正规数组那样高效的。且一旦有洞,后续将数组补全也无法恢复到真实的数组。也就是说,这个性能的损失是不可挽回的。 所以,JS 中尽量避免创建不连续数组。 另外,如果元素全为数字的数组操作起来性能会好些。 ### 数组构造器 通过数组构造器可以很方便地创建指定长度的数组。 ``` const arr_with_hole = [1,,2]; // arr_with_hole[1] => undefined ``` 如你所见,这个数组全是洞。尝试访问其元素将会得到 `undefined`。所以, * 其性能差 * `undefined` 不是一个友好的初始值 如果为了解决初始值的问题,数组身上的 `fill()` 方法能派上用场。 ``` const arr = new Array(3); // arr => [empty × 3] // arr[1] => undefined ``` _注意_:如果使用对象填充数组,数组所有元素指向的是同一对象。这点不难理解,但是很坑爹。 ``` const arr = new Array(3).fill(0); // arr => [0,0,0] // arr.fill('hello') => ['hello','hello','hello'] ``` ### 使用循环 既然字面量方式无法满足任意长度的情况,那明直接的办法就是 `for` 循环了。 ``` const arr = new Array(3).fill({}); arr[0].name = "张三"; // a[1] => {name:'张三'} ``` 此种方式创建的数组没有洞,原生高效,但创建过程并不高效,因为在内部实现上,每次元素的添加都需要重新分配空间。 ### `Array.from` `Array.from` 可以从数组创建数组。特别地,它可以将类数组(array-like)转成真 · 数组。 类数组最著名代表人物有: * 函数内部获取到的参数对象 `arguments`, * `document.querSelector('p')` 返回的 DOM 节点列表 类数组只是呈现上像数组,因为是假的,其身上并没有数组该有的原型方法比如 `sort()`,`filter()`。 `Array.from` 也会将数组中薛定谔的洞塌缩成具体的值,于是我们可以通过它轻松得到一个全是 `undefined` 的数组。 ``` const NUM = 3; const arr = []; for (let i = 0; i < NUM; i++) { arr.push(0); } // arr => [0,0,0] ``` 此外,`.from()` 可以传递一个 `map` 方法作为第二个参数,这样在创建新数组时会运用上这个映射函数。 ``` Array.from(new Array(3)); // [undefined,undefined,undefined] ``` _Bonus_ 若不真的看见,我大概不会相信还可以这样操作: ``` Array.from(new Array(3), (v, i) => i); // [0,1,2] Array.from(new Array(3), () => "矢泽妮可"); // ['矢泽妮可','矢泽妮可','矢泽妮可'] ``` 缘何上面的代码也能给我们三个可爱的「矢泽妮可」。魔法在于 `{length: 3}` 被当作类数组处理了,天秀! ### `keys()` `keys()` 返回 iterable,通过将其解构可以得到数组: ``` Array.from({ length: 3 }, () => "矢泽妮可"); // ['矢泽妮可','矢泽妮可','矢泽妮可'] ``` ### Tips * 关注代码的可读性而不是微小的性能差异,因为现今的 JS 引擎可以很好地处理性能了 * 如果处理的是大量数字类型的数组,使用 [`Typed Arrays`](http://exploringjs.com/es6/ch_typed-arrays.html) ### 参考 * [Creating and filling Arrays of arbitrary lengths in JavaScript](http://2ality.com/2018/12/creating-arrays.html#cheat-sheet-creating-arrays)
幻翼
2022年1月18日 15:57
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码