在javascript中,我定义了如下数组
var arr = [1,2,3];
我也可以做
arr[-1] = 4;
现在如果我这么做了
arr = undefined;
我还丢失了对arr-1处的值的引用。
所以对我来说,从逻辑上讲,arr-1似乎也是arr的一部分。
但当我执行以下操作时(没有将arr设置为未定义)
arr.length;
它返回3而不是4;
所以我的观点是,如果数组可以和负索引一起使用,那么这些负索引也应该是它们长度的一部分**,。我不知道,可能是我错了,也可能是我错过了一些关于数组的概念。
发布于 2012-11-29 12:01:30
对我来说,从逻辑上讲,
-1也是arr的一部分。
是的,但不是你想的那样。
您可以为数组分配任意属性(就像JavaScript中的任何其他对象一样),这就是您在-1
为数组“索引”并赋值时所做的事情。由于这不是数组的成员,而只是一个任意属性,因此您不应期望length
会考虑该属性。
换句话说,下面的代码做同样的事情:
var arr = [1, 2, 3];
arr.cookies = 4;
alert(arr.length) // 3;
发布于 2012-11-29 12:09:05
length
属性将返回一个大于最高赋值“索引”的数字1,其中数组“索引”是大于或等于零的整数。请注意,JS允许“稀疏”数组:
var someArray = [];
someArray[10] = "whatever";
console.log(someArray.length); // "11"
当然,如果没有元素,那么length
就是0
。还要注意,如果使用delete
删除最高的元素,则length
不会更新。
但数组是对象,因此您可以使用包括负数或分数在内的其他任意属性名称来分配属性:
someArray[-1] = "A property";
someArray[3.1415] = "Vaguely Pi";
someArray["test"] = "Whatever";
请注意,在幕后,JS会将属性名称转换为字符串,即使您提供了像-1
这样的数字。(正整数索引也会变成字符串。)
数组方法,如.pop()
、.slice()
等,只适用于零或更高的整数“索引”,而不适用于其他属性,因此length
在这一点上是一致的。
发布于 2012-11-29 12:16:43
请注意,当您使用位置(或0)索引时,值被放置在数组中:
var array = [];
array[0] = "Foo";
array[1] = "Bar";
// Result: ["Foo", "Bar"]
// Length: 2
当您添加非索引值(不是0-9+)时,情况并非如此:
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"
array[-1]; // "Fizzbuzz"
但请再次注意,这不是数组值的一部分,因为它的"index“是无效的。相反,它只是作为另一个成员添加到数组中。我们可以用同样的方式访问其他数组成员:
array["pop"]; // function pop() { [native code] }
注意,这里我们访问的是数组上的pop
方法,它告诉我们这包含本机代码。我们访问的不是带有“pop键”的任何数组值,而是数组对象本身的一个成员。我们可以通过遍历对象的公共成员来进一步确认这一点:
for (var prop in array)
console.log(prop, array[prop]);
它显示了以下内容:
0 Foo
1 Bar
-1 Fizzbuzz
再说一次,它在对象上,但不在数组中。
这是一个很棒的问题!这让我肯定做了一次重复拍摄。
https://stackoverflow.com/questions/13618571
复制相似问题