为什么`.forEach`适用于密集数组但不适用于稀疏数组? [复制]

2024-05-01

我试图理解“空”稀疏数组之间的区别(例如new Array(3))和一个等效的“空”密集数组(具有 3 个未定义条目的数组)。

我可以通过以下两种方式创建一个包含 3 个未定义值的数组:

var sparse = new Array(3);
// or
var sparse = [,,,];

var dense = Array.apply(null, Array(3)); // See dense array link below

密集阵列 http://www.2ality.com/2012/06/dense-arrays.html

如果我对其中任何一个执行 console.log ,结果是:

[undefined, undefined, undefined]

如果我循环每个数组以将其与另一个数组进行比较,它们将严格匹配:

console.log(sparse.length === dense.length);

// true

for (var i = 0; i < dense.length; i++) {
  console.log(i +':'+ (dense[i] === sparse[i]));
}

// '0:true'
// '1:true'
// '2:true'

但是,如果我使用.forEach (or map, reduce等),那么回调函数将永远不会在稀疏数组上被调用,但会在密集数组上被调用 3 次:

sparse.forEach(function(val,i){
   console.log(i +':'+ val);
});

// Nothing. No-op.

dense.forEach(function(val,i){
   console.log(i +':'+ val);
});

// '0:undefined'
// '1:undefined'
// '2:undefined'

所以我的问题是:

  1. 如果它们都具有相同的长度、索引和值,那么如何一个可迭代而另一个不可迭代?
  2. 差异的原因是什么?
  3. 确定数组是稀疏还是密集的最佳方法是什么?

  1. 如果它们都具有相同的长度、索引和值,那么如何一个可迭代而另一个不可迭代?

这些功能是明确记录 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach以这种方式执行。两个数组都是可迭代的,但是forEach/map/etc 显式跳过不在数组中的索引:

var sparse = new Array(3);
var dense = Array.apply(null, Array(3)); // See dense array link belo

1 in sparse; // false
1 in dense; // true

// Sparse can still be iterated over
sparse[100] = 'a'
sparse.forEach(function (n, i) { console.log(n, i) }); // a 100
  1. 差异的原因是什么?

大概已做出明确决定省略不存在的索引

  1. 确定数组是稀疏还是密集的最佳方法是什么?

您可以使用以下内容:

function isSparse(array) {
  for (var i = 0; i < array.length; ++i) {
    if (!i in array)
      return true;
  return false;
}

回复:您的评论

[] 没有索引而 [undefined, undefined, undefined] 有索引,这肯定是有原因的。

There doesn't必须有一个原因,这就是它们的构建方式。一个有钥匙,另一个没有。

Look:

Object.keys(Array(3)) // => []
Object.keys(['a','b']) // => ["0", "1"]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么`.forEach`适用于密集数组但不适用于稀疏数组? [复制] 的相关文章

  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • jQuery 中的 Javascript .files[0] 属性

    jQuery 中是否有与此语句等效的语句 var value document getElementById id files 0 使用附加 files 0 的标准 jQuery 选择器似乎不起作用 并且我找不到与 files 等效的 jQ
  • 在 MongoDB 中查找具有字符串 ID 数组的文档

    我有一个 id 字符串数组 我想将其与 find 函数一起使用 db companies find id in arr arr看起来像这样 563a2c60b511b7ff2c61e938 563a2c60b511b7ff2c61e8b7
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 为什么 jQuery 点击事件会多次触发

    我这里有这个示例代码http jsfiddle net DBBUL 10 http jsfiddle net DBBUL 10 document ready function creategene click function confir
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 将一个文本框的内容复制到另一个文本框

    假设在文本框中输入了一个条目 是否可以在第二个文本框中保留相同的输入文本 如果是这样 这是如何完成的
  • 在 PHP 中使用数组来比较用户名/密码

    我有以下 php 脚本 其中有一个用户名和密码 Username user1 Password pass1 if isset POST submitform Clean up the input values foreach POST as
  • 未捕获的引用错误:myFunction 未定义[重复]

    这个问题在这里已经有答案了 这到底是怎么回事 http jsfiddle net sVT54 http jsfiddle net sVT54
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐

  • “箭头函数”和“函数”是否等效/可互换?

    ES2015中的箭头函数提供了更简洁的语法 我现在可以用箭头函数替换所有函数声明 表达式吗 我需要注意什么 例子 构造函数 function User name this name name vs const User name gt th
  • 如何在AWS批处理中定义根卷大小

    我正在使用 AWS Batch 但发现根卷大小对于我的任务来说太小 我尝试创建一个新的计算环境 作业队列 但没有任何选项来设置卷大小 我尝试更改启动配置here https console aws amazon com ec2 autosc
  • Eclipse 编辑器选项卡环绕

    I can switch editors in Eclipse by using Ctrl PgUp PdDown 但是 当选择最左边的编辑器选项卡时 我无法再将一个选项卡切换到左侧并环绕以到达最右边的选项卡 如何使编辑器选项卡环绕 The
  • 用 Java 创建 PDF 的缩略图

    我正在寻找一个 Java 库 它可以获取 PDF 并从第一页创建缩略 图 PNG 我已经看过 JPedal 但其疯狂的许可费完全令人望而却步 我目前正在使用 iText 来操作 PDF 文件 但我相信它不会生成缩略图 我可以在命令行上使用
  • 如何使用Node+Express渲染多个视图

    我有一个 header html 和一个 footer html 我希望与其他视图一起呈现 我想使用 Node Express 来完成这个任务 我尝试通过以下方式渲染视图 但显然它不起作用 var express require expre
  • Javascript 图像 src 属性返回错误值

    我有一些 javascript 代码附加到一个带有 onclick 的按钮 代码如下 function ondelete var getDiv document getElementById imgdiv var lb img imgdiv
  • iPhone:应用程序被终止时保留 NSUserDefaults 值

    我正在尝试使用 NSUserDefaults 实现 添加到收藏夹 功能 到目前为止我已经编写了以下代码 void favouriteButtonClicked id sender favselected favselected favsel
  • 如何在 Anaconda 中使用 Python Dbus 绑定

    我正在尝试在 Anaconda python 环境上安装 dbus 但我很挣扎 这是我收到的错误消息 e gateway python Python 3 5 4 Anaconda custom 64 bit default Oct 13 2
  • 在intellij中为java启用ssl调试

    从我的问题开始 上一期尝试通过 tls ssl 发送 java 邮件 https stackoverflow com questions 39259578 javamail gmail issue ready to start tls th
  • 在python中乘以多维数组

    我在 3d 数组中存储了许多 2d 数组 我需要将每个数组与一个向量相乘 所以我将所有这些向量存储在一个二维数组中 就像这样 A np random random L M N B np random random L M 我需要将每个 A
  • 使用 jQuery 测试某个元素是否具有某个类

    我正在尝试测试课程是否存在intra field label在一个元素上 该元素将有多个类 我该怎么做 Use hasClass http api jquery com hasClass http api jquery com hasCla
  • C# Winforms - ProgressBar 无法正确显示和重置

    我有一个 Windows 桌面应用程序 正在使用 Visual Basic 中的 Windows 窗体编写 在这个应用程序中 我想显示一个简单的进度条 但我遇到了一个奇怪的问题 下面是更新进度条的简单 for 循环示例 pBar Visib
  • 我什么时候应该在 RMI 中实现 java.io.Serializable?

    我刚刚开始 Java RMI 对于何时使用 java io Serialized 存在一些问题 所以任何人都可以给我一个必须实现 java io Serializing 的 RMI 示例 谢谢 UPDATE i had made a sim
  • 单元格显示日期但不显示时间

    在我的 Excel 工作表中 我在一个单元格中添加了日期和时间 如下所示 在顶部 在效果栏中 它显示日期和时间 问题是 在单元格中它只显示日期 但我希望时间和日期都显示在单元格中 谁能帮我这个 选择 ColumnB 主页 gt 单元格 格式
  • bash:从数组中删除变量? [复制]

    这个问题在这里已经有答案了 bin bash tank one two three x two unset tank x echo tank 我想从数组中删除 x 但不知何故它删除了数组的第一个元素 我该如何解决这个问题 您有一个索引数组
  • Chrome 上的 BetterJsPop 错误是什么?

    我在 Chrome 上使用 React js 应用程序时遇到此错误 但在 Mozilla 上它运行得很好 有谁知道这意味着什么或者这个错误指的是什么 VM1407 20 Uncaught TypeError Cannot redefine
  • 在 StackPanel 中拉伸文本框

    这是我当前用来执行此操作的 XAML 并且我一生都无法弄清楚如何扩展文本框以填充整个列 有人可以指导我正确的方向吗 先感谢您
  • Scipy map_coordinates 双线性插值与 interp 和 IDL 插值比较

    我正在将同事的 IDL 代码重写为 python 并发现了一些我感到困惑的差异 根据我发现的其他问题和邮件列表线程 如果您使用scipy ndimage interpolation map coordinates并指定order 1它应该进
  • Sql Server 2005 将列名放在方括号中

    我最近将数据库从 Sql Server 2000 迁移到 Sql Server 2005 在表设计器中 它坚持将方括号放在名为 Content 的列周围 我在 Sql Server 的保留字列表中没有看到 Content 所以我不明白它为什
  • 为什么`.forEach`适用于密集数组但不适用于稀疏数组? [复制]

    这个问题在这里已经有答案了 我试图理解 空 稀疏数组之间的区别 例如new Array 3 和一个等效的 空 密集数组 具有 3 个未定义条目的数组 我可以通过以下两种方式创建一个包含 3 个未定义值的数组 var sparse new A