为什么 JS 允许在数组中使用负索引?

2023-12-10

为什么 JS 中数组的负索引不会引发错误?看起来它不打算在数组中包含具有负索引的元素:

  • array.length不计算具有负索引的元素。
  • array.forEach()不会迭代具有负索引的元素。

UPD。问题不是“为什么它在技术上是可能的”,而是“为什么它在设计上是允许的”。

[已解决] 简短回答:没有什么特别的原因,只是碰巧变成这样。


数组是 JavaScript 中特殊类型的对象。它有一个额外的方法和属性列表(例如.length and .forEach),并且它还有一个已使用索引的列表(从零开始的整数正数)。 但就像任何其他对象一样,它可以具有其他属性:

var arr = ['A', 'B'];
arr.extra = 'C';
console.log(arr[0], arr[1], arr.extra); // A B C

由于对象属性不仅可以通过点访问,还可以通过方括号访问,因此您可以使用类似数组的语法访问任何属性:

var obj = { extra: 'D' };
console.log(obj['extra']); // D
console.log(arr['extra']); // C

使用相同的语法,您可以分配属性:

obj['x'] = 'E';
obj[33] = 'F';
arr['y'] = 'G';
arr[-1] = 'H';
console.log(obj.x, obj[33], arr.y, arr[-1]); // E F G H

您可以安全地使用数字作为对象的属性名称,它会自动转换为字符串。

唯一的区别是当您使用正整数值作为属性名称时。这些被解释为数组索引。

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

为什么 JS 允许在数组中使用负索引? 的相关文章

随机推荐

  • 选择可变参数模板最后一个参数的有效方法

    我知道如何选择可变参数模板的第一个参数 template lt class Args gt struct select first template lt class A class Args gt struct select first
  • Python 中奇怪的前导字符 utf-8/utf-16 编码

    我写了一个简化版本来演示这个问题 我正在以 utf 8 和 UTF 16 格式对特殊字符进行编码 使用 utf 8 编码没有问题 当我使用 UTF 16 编码时 我得到一些奇怪的前导字符 我尝试删除所有尾随和前导字符 但错误仍然存 在 代码
  • jquery 每个循环内的 Ajax 调用

    这是一个我必须通过 ajax 调用写入 xml 文件的函数 第一次进行 ajax 调用时 代码可以正常工作 在第二个each 循环中 根本不进行ajax 调用 我不知道为什么 我将 asyn 指定为 false 但这没有帮助 无论如何 这似
  • Q-Learning 值太高

    我最近尝试在 Golang 中实现基本的 Q Learning 算法 请注意 我对强化学习和人工智能总体来说是新手 所以这个错误很可能是我的 以下是我如何在 m n k 游戏环境中实施解决方案 在每个给定的时间t 代理持有最后的状态动作 s
  • MVC 3 - 模型绑定表中的列表,每个记录是一列而不是行

    我可以找到有关如何在 MVC 3 中模型绑定项目列表的各种文章 甚至可以在表中进行模型绑定 但在每个示例中 行代表列表中的一条记录 我的观点的要求是每条记录必须是一列 我无法从以下文章中获得任何技巧 http blog stevensand
  • 根据列表中的条件合并列表项

    我有一个项目清单 例如 a IP 123 84 apple mercury IP 543 65 killer parser goat IP 549 54 pineapple django python 我想根据条件合并列表项 即合并所有项目
  • iOS:如何关闭弹出窗口[重复]

    这个问题在这里已经有答案了 可能的重复 如何关闭故事板弹出窗口 我有一个 iPad 故事板 将一个视图中的栏按钮项按住 Control 键拖动到另一个视图 并选择弹出框样式 当我按下按钮时 新的弹出窗口视图将显示在弹出窗口中 但我有两个问题
  • 使用 Java 中的 ImageIO 编写 TIFF 的平铺输出

    我拥有的是大量的帧 需要将它们放在一起形成更大的图像 如马赛克 所需的图像位置是已知的 图像数量非常多 因此将它们全部加载到内存中是不切实际的 根据这里的一些其他答案 我能够覆盖 RenderedImage 中的方法 特别是getData
  • 厨师食谱中使用了哪些 ruby​​ 功能?

    我刚开始使用 Chef 对 ruby 不太了解 我无法理解食谱中使用的语言语法 比如说 我在食谱中的recipes default rb 中创建一个目录 如下所示 directory home test mydir do owner tes
  • 确定 C++ 应用程序是否作为 UWP 应用程序运行并具有旧版支持

    我的第一个想法是使用GetPackageFamilyName 并寻找ERROR SUCCESS vs APPMODEL ERROR NO PACKAGE 但是 我需要支持 Windows 7 这使得GetPackageFamilyName
  • jQuery validate - 如何防止自动提交?

    我热衷于使用 jQuery 验证器插件来验证我的代码 但我想禁用自动提交表单 我宁愿自己使用 jQuery 发送它 post method 事实上 考虑到我的按钮不是类型 我不太确定为什么要提交表单submit但只是
  • java进程间通信

    是否可以使用在命令行中运行java类来运行正在运行的swing中的某个类或函数 例如 当java Test asd将setText一个正在运行的swing Jlabel设置为asd 这两个程序在不同的进程中运行 您需要在进程之间创建一个接口
  • 在正则表达式中获取非法字符范围:java

    我有一个简单的正则表达式模式来验证名称 但是当我运行它时 我收到非法字符范围错误 我认为通过转义 s 它将允许一个空格 但编译器仍然抱怨 public boolean verifyName String name String namePa
  • PHP 支持 MVP 模式吗?

    有很多使用 ASP NET 解释 MVP 模式的示例 但没有找到任何使用 PHP 的示例 我是 PHP 程序员 想知道在哪里可以获得 MVP 模式 PHP 示例 简短的回答是 是的 PHP 可以 Note its not exactly M
  • 如何在 JavaScript 中换行?

    请告诉我如何在 JavaScript 中换行
  • 连接两个 Pandas DataFrame 同时保持索引顺序

    基本问题 我试图连接两个 DataFrame 生成的 DataFrame 按原始两个的顺序保留索引 例如 df pd DataFrame Houses 10 20 30 40 50 Cities 3 4 7 6 1 index 1 2 4
  • 升级到rails 3.1.0后ActionView::Template::Error(参数数量错误(1代表0))与atom_feed

    我刚刚将 Rails 应用程序从 3 0 7 版本升级到候选版本 3 1 0 我的 Atom feed 构建器中出现了一个奇怪的错误 ActionView Template Error wrong number of arguments 1
  • WPF/Metro 风格:使 ListView 只显示完整的项目

    在我的 Metro 应用程序中 我有一个包含一定数量项目 例如 25 个 的数据源 我有一个显示这些项目的 ListView 我的问题是 ListView 的大小允许它显示 6 5 个项目 因此它显示的最后一个项目被切成两半 如果分辨率改变
  • 如何在asp.net web应用程序中调用javascript方法

    我想在 C 函数中使用 javascript 函数 protected void button1 Click object sender EventArgs e javascript function call ex boolean b t
  • 为什么 JS 允许在数组中使用负索引?

    为什么 JS 中数组的负索引不会引发错误 看起来它不打算在数组中包含具有负索引的元素 array length不计算具有负索引的元素 array forEach 不会迭代具有负索引的元素 UPD 问题不是 为什么它在技术上是可能的 而是 为