【问题标题】:JavaScript access invalid index [duplicate]JavaScript访问无效索引[重复]
【发布时间】:2020-02-11 13:16:04
【问题描述】:

今天我发现一个奇怪的代码

const nums = [1, 2, 3]
console.log(nums[-1])

我可以看到日志是undefined。为什么在 JavaScript 中,我们可以访问无效索引而不会抛出任何错误?

【问题讨论】:

  • 因为这是定义语言的工作方式。
  • JS 数组是一个“类似列表”的对象,对象可以有不同的属性。当您使用 非标准 索引时,您不能再依赖 length 属性。
  • “为什么?”该语言以某种方式工作是无法回答的,除非由该语言的发明者负责。你要求一个索引并返回未定义,这在 JavaScript 中并不奇怪。 JS 中的数组是可以增长到任意大小的关联数组,它们不像其他语言那样是固定的连续内存集。您需要做的就是在尝试使用之前检查该值是否已定义。
  • @skyline3000 没有任何大小。最大长度为 2³² − 1(因此最大索引为 2³² − 2)。您仍然可以分配更高的索引,但它们不会成为实际可迭代的一部分。此外,在大多数情况下,您不需要检查索引。如果你没有使用sparse arrays,你可以例如使用可用的Array 方法对它们进行迭代。

标签: javascript arrays


【解决方案1】:

JavaScript 数组是一类对象,数组项是对象属性。

数组可以有其他属性名称,但用于查找或设置数组条目的非负整数会影响数组的 length 属性。

数组的长度保持为比用于在数组中存储条目的最高非负索引值大一,或用于设置数组的非负整数@987654322 @属性本身。

查找a[-1]返回undefined的原因是没有设置。如果你先设置它,你会得到它的值:

var a = [];
a[-1] = "silly";
console.log(a[-1]);

负数“indeces”被转换为字符串并用作属性名称。它们不会影响 length 属性。因为它们会使任何试图维护代码的人感到困惑,避免故意使用负面的低级 - 没有其他人这样做。

【讨论】:

    【解决方案2】:

    因为这只是对未定义属性的属性访问。负“索引”不会成为数组行为的一部分,否则它们具有字符串形式,因此可以用作对象的属性名称,其中也包括数组。
    (数组可以有任何类型的属性,如果一个属性恰好足够像索引,它将被包含在数组行为中)

    var someObject={
      "-1":-1,
      "a":"a"
    };
    console.log(someObject[-1],someObject["a"],someObject[-2]);
    
    var someArray=[1,2,3];
    someArray["4"]=5;
    someArray.b="b";
    console.log(someArray.length,someArray,someArray["b"],someArray.c);
    
    var someVariable;
    console.log(someVariable);

    undefined 实际上是所有内容的默认值。

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2017-03-19
      • 2018-03-31
      相关资源
      最近更新 更多