JavaScript数组保留未定义的元素
在google chrome控制台中,如果我初始化数组:JavaScript数组保留未定义的元素,javascript,arrays,Javascript,Arrays,在google chrome控制台中,如果我初始化数组: var arr = []; arr[5] = 10; 然后在控制台中打印arr,显示: [undefined × 5, 10] 未定义x5它只是chrome的表示还是实际内存 保留的 arr[4]和arr[6]as之间有什么区别 两种打印都未定义 如果保留的未定义的x5实际上是保留空间,那么它有什么用 这意味着第六个条目是10 所有其他的都是空的(未定义) var arr=[]; arr[5]=10; console.log(arr
var arr = [];
arr[5] = 10;
然后在控制台中打印arr
,显示:
[undefined × 5, 10]
未定义x5
它只是chrome的表示还是实际内存
保留的李>
arr[4]
和arr[6]
as之间有什么区别
两种打印都未定义
未定义的x5
实际上是保留空间,那么它有什么用这意味着第六个条目是
10
所有其他的都是空的(未定义
)
var arr=[];
arr[5]=10;
console.log(arr[4])
如果为x赋值。当前为空的数组的索引,
将更新数组长度
见:,上面写着:
在JavaScript数组上设置属性时,如果该属性是有效的数组索引且该索引超出数组的当前边界,则引擎将相应地更新数组的length属性
在这种情况下,数组的长度将为6,因为您正在分配数组中的第6个位置。其余所有索引将携带null
值
下面的示例将为您提供更好的想法:
var arr=[];
arr[5]=10;
document.getElementById('element').innerHTML=JSON.stringify(arr)代码>
未定义的X5是否只是chrome的表示或实际保留的内存
没有
您正在描述的内容称为稀疏数组。在Javascript中,数组本质上是稀疏的。arr[5]
的存在并不意味着arr[0]
的存在。内存分配不到最大索引
可以将Javascript中的数组视为对象类型。关键是索引。事实上,你甚至可以这样做:
arr[3.14] = 'pi';
3.14
是键,pi
是值。键/值对。它类似于声明此对象:
var arr = { '3.14': 'pi' }
不存在的属性也不存在
数组的不同之处在于它们是数组,这意味着它们有索引并且是基于零的。因此,对于索引(读取键)0
到n
,值是未定义的
如果你做了一个arr[200000]=“something”
,这并不意味着0
到19999
会浪费内存
arr[4]和arr[6]之间的区别是什么,因为两种打印都未定义
没有区别。“未定义”是指未定义。在Javascript中,您可以很好地引用远远超出声明的最大值的索引,并且没有超出范围的内容。你只能得到“未定义”
如果它实际上是保留空间,那么保留的未定义x5有什么用
这可能既方便又不方便。这取决于你怎么看。关于保留空间,请参见上文第1点
您可以通过迭代数组来轻松验证这一点。参见下面的小示例,您将了解到0
到4
之间不存在
例如:
//仅用于片段演示
console.log=function(txt){var result=document.getElementById(“结果”);result.innerHTML+=txt+“
;”
//迭代稀疏数组的演示
var-arr=[];
arr[5]=10;
arr.forEach(函数(elem,idx){
console.log(idx+“=”+elem);
});代码>
FF输出中的
比较干净:数组[,10],因此它是同一事物的不同浏览器表示形式…console.log依赖于浏览器,但未定义的和null
是不同的原语undefined===null
导致false,而typeof null
导致“object”。在这种情况下,JSON不能存储undefined,它将存储null。arr[4]
和arr[6]
的实际值未定义,因为您没有在任何地方定义它。在任何浏览器中,此行为都不会改变..JSON.stringify
与稀疏数组无关。它事先不知道要序列化的数组是否有漏洞。它只是使用length
进行迭代,并报告不存在的属性的null
。事实上,数组中不存在元素,仅此而已。@Abhitalks,使用JSON.stringify
的目的就是演示数组中的长度和值。如果我们定义长度或数组而不真正添加值,然后该值保持未定义,这就是我要显示的。如果我指定arr[999]=10
arr.length
表示1000。这是否意味着,arr
保留999个undefined
元素?消息前面的“undefined”与数组中的数据无关。但是,如果在未提供数据的情况下为数组[0]执行console.log,则会导致未定义。没有像C数组那样保留内存,因为JavaScript数组只是一个列表,并保存对其元素的引用(“指针”)。但是,类型化数组是不同的。他们不允许像非类型的稀疏数组那样出现间隙/孔洞。这是一个非常技术性的主题(对于像我这样的业余爱好者来说),但我可以问一下为什么:数组长度是6吗?@nevermind:那是因为它是一个数组。数组与对象的不同之处在于它们具有索引并且是基于零的。因此,数组的长度将是最高索引+1。但是,间隙是很好的,未定义。好的,谢谢,所以内存没有分配(不保留空格),内存中没有5个默认值为未定义的变量。如果我这样做:var first=arr[0];如果我理解正确,那么应该保留内存空间(默认值:未定义)?是@nevermind,现在您显式声明了一个变量。@abdul wahab:(1)arr[4.5]
不可枚举,因为它现在是一个对象。但是,您仍然可以在
语法中使用for..进行迭代。但是,这是现在