首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript数组中的负索引是否应该影响数组长度?

JavaScript数组中的负索引是否应该影响数组长度?
EN

Stack Overflow用户
提问于 2012-11-29 11:56:00
回答 7查看 68.1K关注 0票数 89

在javascript中,我定义了如下数组

代码语言:javascript
复制
var arr = [1,2,3];

我也可以做

代码语言:javascript
复制
arr[-1] = 4;

现在如果我这么做了

代码语言:javascript
复制
arr = undefined;

我还丢失了对arr-1处的值的引用。

所以对我来说,从逻辑上讲,arr-1似乎也是arr的一部分。

但当我执行以下操作时(没有将arr设置为未定义)

代码语言:javascript
复制
arr.length;

它返回3而不是4

所以我的观点是,如果数组可以和负索引一起使用,那么这些负索引也应该是它们长度的一部分**,。我不知道,可能是我错了,也可能是我错过了一些关于数组的概念。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-11-29 12:01:30

对我来说,从逻辑上讲,

-1也是arr的一部分。

是的,但不是你想的那样。

您可以为数组分配任意属性(就像JavaScript中的任何其他对象一样),这就是您在-1为数组“索引”并赋值时所做的事情。由于这不是数组的成员,而只是一个任意属性,因此您不应期望length会考虑该属性。

换句话说,下面的代码做同样的事情:

代码语言:javascript
复制
​var arr = [1, 2, 3];

​arr.cookies = 4;

alert(arr.length) // 3;
票数 119
EN

Stack Overflow用户

发布于 2012-11-29 12:09:05

length属性将返回一个大于最高赋值“索引”的数字1,其中数组“索引”是大于或等于零的整数。请注意,JS允许“稀疏”数组:

代码语言:javascript
复制
var someArray = [];
someArray[10] = "whatever";
console.log(someArray.length); // "11"

当然,如果没有元素,那么length就是0。还要注意,如果使用delete删除最高的元素,则length不会更新。

但数组是对象,因此您可以使用包括负数或分数在内的其他任意属性名称来分配属性:

代码语言:javascript
复制
someArray[-1] = "A property";
someArray[3.1415] = "Vaguely Pi";
someArray["test"] = "Whatever";

请注意,在幕后,JS会将属性名称转换为字符串,即使您提供了像-1这样的数字。(正整数索引也会变成字符串。)

数组方法,如.pop().slice()等,只适用于零或更高的整数“索引”,而不适用于其他属性,因此length在这一点上是一致的。

票数 26
EN

Stack Overflow用户

发布于 2012-11-29 12:16:43

请注意,当您使用位置(或0)索引时,值被放置在数组中:

代码语言:javascript
复制
var array = [];

array[0] = "Foo";
array[1] = "Bar";

// Result: ["Foo", "Bar"]
// Length: 2

当您添加非索引值(不是0-9+)时,情况并非如此:

代码语言:javascript
复制
var array = [];

array[0]  = "Foo";
array[1]  = "Bar";
array[-1] = "Fizzbuzz"; // Not a proper array index - kill it

// Result: ["Foo", "Bar"]
// Length: 2

仅当您按规则进行游戏时,值才会放入数组中。如果你不这样做,他们就不会被接受。然而,它们在数组对象本身上是被接受的,JavaScript中的几乎任何东西都是这种情况。即使["Foo", "Bar"]是数组中唯一的值,我们仍然可以访问"Fizzbuzz"

代码语言:javascript
复制
array[-1]; // "Fizzbuzz"

但请再次注意,这不是数组值的一部分,因为它的"index“是无效的。相反,它只是作为另一个成员添加到数组中。我们可以用同样的方式访问其他数组成员:

代码语言:javascript
复制
array["pop"]; // function pop() { [native code] }

注意,这里我们访问的是数组上的pop方法,它告诉我们这包含本机代码。我们访问的不是带有“pop键”的任何数组值,而是数组对象本身的一个成员。我们可以通过遍历对象的公共成员来进一步确认这一点:

代码语言:javascript
复制
for (var prop in array) 
    console.log(prop, array[prop]);

它显示了以下内容:

代码语言:javascript
复制
 0 Foo
 1 Bar
-1 Fizzbuzz

再说一次,它在对象上,但不在数组中。

这是一个很棒的问题!这让我肯定做了一次重复拍摄。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13618571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档