我在ideone中尝试以下代码:
var a = [];
a[0] = 0;
a[5] = 5;
a[6] = undefined;
print("contents before popping:");
for(var e in a) print("\ta[", e, "] =", a[e]);
print("a.length =", a.length);
for (var i = 0; i < a.length; i++)
print("\ta.hasOwnProperty(", i, ") =", a.hasOwnProperty(i));
print("popping -->", a.pop());
print("popping -->", a.pop());
print("contents after popping:");
for(var e in a) print("\ta[", e, "] =", a[e]);
print("a.length =", a.length);
for (var i = 0; i < a.length; i++)
print("\ta.hasOwnProperty(", i, ") =", a.hasOwnProperty(i));
Run Code Online (Sandbox Code Playgroud)
输出如下:
contents before popping:
a[ 0 ] = 0
a[ 5 ] = 5
a[ 6 ] = undefined
a.length = 7
a.hasOwnProperty( 0 ) = true
a.hasOwnProperty( 1 ) = false
a.hasOwnProperty( 2 ) = false
a.hasOwnProperty( 3 ) = false
a.hasOwnProperty( 4 ) = false
a.hasOwnProperty( 5 ) = true
a.hasOwnProperty( 6 ) = true
popping --> undefined
popping --> 5
contents after popping:
a[ 0 ] = 0
a.length = 5
a.hasOwnProperty( 0 ) = true
a.hasOwnProperty( 1 ) = false
a.hasOwnProperty( 2 ) = false
a.hasOwnProperty( 3 ) = false
a.hasOwnProperty( 4 ) = false
Run Code Online (Sandbox Code Playgroud)
在我的JavaScript书中(好吧,Crockford's),我读到数组的长度被计算为所有属性的最大数值.那么,为什么它的最大数值属性为0时长度为5?谢谢!
关于Javascript的一个好处是它的语义是正式的,并且尽可能明确地在标准中定义.具体而言,第15.4节规定:
length属性的值在数值上大于名称为数组索引的每个属性的名称; 无论何时创建或更改Array对象的属性,都会根据需要调整其他属性以保持此不变量.
换句话说,每次更改数组时,都会对其length进行调整,但是,它只能保证大于max(indexes),而不一定等于max(indexes)+1.例如,无论数组实际包含多少元素,pop方法总是删除length-1第th个元素并减length1.
另请注意,大多数数组方法都是通用的,并且不会"专门"了解有关数组的任何信息.它们可以操纵任意对象,如果这样的对象碰巧有一个名为的属性length,它将根据上述规则进行调整.考虑:
foo = {
length: 100,
99: 'hi'
}
alert([].pop.apply(foo)) // hi
alert(foo.length) // 99
alert([].pop.apply(foo)) // undefined
alert(foo.length) // 98
Run Code Online (Sandbox Code Playgroud)
也就是说,在您的问题的上下文中,如何表示数组的确切无关 - pop并且朋友不使用此信息.
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |