Ahm*_*ven 19 javascript arrays
我只是想了解Javascript数组是如何工作的,但我在这里遇到了一个复杂的问题.
首先我创建了我的数组:
var arr = [];
Run Code Online (Sandbox Code Playgroud)
并在其中设置一些元素:
arr[5] = "a thing";
arr[2] = undefined;
Run Code Online (Sandbox Code Playgroud)
我认为我应该有一个大小为2的数组,因为我在2个特定索引上只有两个对象.所以我用.length数组的属性测试了它:
document.write(arr.length + "<br>");
Run Code Online (Sandbox Code Playgroud)
有趣的是,结果是6.但它必须包含两个项目.它的大小怎么样?它可能与我在这里使用的最新索引有关arr[5] = "a thing";
然后我试图循环它:
var size = 0;
for(var x in arr){
size++;
}
Run Code Online (Sandbox Code Playgroud)
而size可变现在是2.所以,我从中学到:如果我使用一个for in循环,我会计算有多少性能是它,而不是它的最后一个索引.
但是,如果我尝试document.write(arr[4])(尚未设置),它写道undefined.
那么为什么要arr[2]计入for..in循环,但不是arr[4]?
让我回答一下我的问题:我在想什么typeof undefined == undefined是非常真实的.但这是JavaScript,我们需要使用自己的规则来玩它:)
jsFiddle和片段如下.
var arr = [];
arr[5] = "a thing";
arr[2] = undefined;
document.write(arr.length + "<br>");
var size = 0;
for(var x in arr){
size++;
}
document.write(size + "<br>");
document.write(arr[4] + "<br>");Run Code Online (Sandbox Code Playgroud)
the*_*eye 12
注意:数组索引只是Array对象的属性.
引用MDN的关系length和数值属性部分,
当属性是有效的数组索引并且该索引超出数组的当前边界时,在JavaScript数组上设置属性时,引擎将相应地更新数组的
length属性.
引用ECMA脚本5 数组对象的规范,
每当添加名称为数组索引的属性时,如果需要,将更改length属性,使其大于该数组索引的数值 ; 每当更改length属性时,将自动删除名称为数值索引且值不小于新长度的每个属性
因此,当您在索引处设置值时5,JavaScript引擎会将Array的长度调整为6.
引用ECMA脚本5 数组对象的规范,
属性名称
P(在一个字符串值的形式)是一个数组索引当且仅当ToString(ToUint32(P))是等于P和ToUint32(P)不等于2 32 -1.
因此,在您的情况下,2并且4是有效的索引,但只2在数组中定义.你可以这样确认
arr.hasOwnProperty(2)
Run Code Online (Sandbox Code Playgroud)
其他索引尚未在数组中定义.因此,您的数组对象称为稀疏数组对象.
那么为什么arr [2]被计入for..in循环而不是arr [4]不算?
在for..in列举了对象的所有有效的枚举的属性.在您的情况下,由于只是2数组中的有效属性,因此将对其进行计数.
但是,当您打印时arr[4],它会打印undefined,因为undefined如果您尝试访问未在对象中定义的属性,则JavaScript将返回.例如,
console.log({}['name']);
// undefined
Run Code Online (Sandbox Code Playgroud)
同样,由于4尚未定义arr,undefined因此返回.
虽然我们是关于这个主题的,但您也可能想要阅读这些答案,
具有该值undefined的属性与不存在的属性之间存在差异,此处使用in运算符说明:
var obj = {
one: undefined
};
console.log(obj.one === undefined); // true
console.log(obj.two === undefined); // true
console.log('one' in obj); // true
console.log('two' in obj); // false
Run Code Online (Sandbox Code Playgroud)
当您尝试获取不存在的属性的值时,您仍然可以获得undefined,但这并不存在.
最后,为了解释你看到的行为:一个for in循环只会循环遍历那个键是in对象的键(并且是可枚举的).
length同时,如果该索引大于或等于当前长度,则只调整为您指定的任何索引.
要从undefined数组中删除值,请尝试使用.filter()
var arr = [];
arr[5] = "a thing";
arr[2] = undefined;
arr = arr.filter(Boolean);
document.write(arr.length);Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12594 次 |
| 最近记录: |