今天我找到了一个奇怪的代码
const nums = [1, 2, 3]
console.log(nums[-1])
并且我可以看到日志为undefined
。为什么在JavaScript中我们可以访问无效索引而不会引发任何错误?
JavaScript数组是一类对象,而数组条目是对象属性。
数组可以具有其他属性名称,但是用于查找或设置数组条目的非负整数会影响数组的length
属性。
数组的长度保持为比用于在数组中存储条目的最大非负索引值大一个,或用于设置数组length
属性本身的非负整数。
查找undefined
返回a[-1]
的原因是尚未设置。如果先设置,则返回其值:
var a = [];
a[-1] = "silly";
console.log(a[-1]);
负的“ indeces”将转换为字符串并用作属性名称。它们不会影响length
属性。因为它们会混淆任何试图维护代码的人,所以避免刻意使用否定词-没有其他人这样做。
因为这只是一个属性-对未定义属性的访问。负“索引”将不会成为数组行为的一部分,但否则它们将具有字符串形式,因此可以用作对象(包括数组)的属性名称。(数组可以具有任何类型的属性,如果一个属性恰好具有类似于索引的属性,则该属性将包含在数组行为中)
var someObject={
"-1":-1,
"a":"a"
};
console.log(someObject[-1],someObject["a"],someObject[-2]);
var someArray=[1,2,3];
someArray["4"]=5;
someArray.b="b";
console.log(someArray.length,someArray,someArray["b"],someArray.c);
var someVariable;
console.log(someVariable);
undefined
实际上是所有内容的默认值。