如果我声明一个数组然后推送给它,它的长度将是“2”而不是“1”,并且第一个元素将是未定义的。
let myArray = [new Array(2)];
myArray.push(['hi', 'hello']);
alert(myArray[0][0]);
这将是未定义的:
但是,如果我将其更改为
alert(myArray[1][0]);
,它将显示数组的第一个元素。
为什么?
在您的代码中,您正在使用单个元素初始化一个数组 myArray,该元素本身就是一个长度为 2 的数组。所以最初,myArray 看起来像这样:
[[undefined, undefined]]
然后,当您调用 myArray.push(['hi', 'hello']) 时,您将向 myArray 添加一个新元素,从而导致:
[[undefined, undefined], ['hi', 'hello']]
所以当你尝试访问myArray[0][0]时,你实际上是在尝试访问数组第一个元素的第一个元素,它是未定义的。但是,当您尝试访问 myArray[1][0] 时,您访问的是数组第二个元素的第一个元素,即“hi”。
要实现您期望的行为,您可以将数组初始化为空数组,然后将新元素推送给它:
let myArray = [];
myArray.push(new Array(2));
myArray.push(['hi', 'hello']);
alert(myArray[0][0]);
这将为您提供未定义的预期输出。
鉴于此:
let myArray = [new Array(2)];
myArray.push(['hi', 'hello']);
问题是为什么以下输出未定义:
alert(myArray[0][0]);
答案:
new Array(2)
创建一个包含两个元素的数组,并且两个元素都设置为未定义的值。
let myArray = [];
创建一个新的空数组。
let myArray = [new Array(2)];
创建一个包含一个元素的数组。那一个元素是一个包含两个值未定义的元素的数组。
myArray.push(['hi', 'hello']);
在myArray
的末尾添加一个元素。这个元素是一个包含两个元素的数组,“hi”和“hello”。
此时,
myArray
看起来像这样:
let myArray = [
[undefined, undefined],
['hi, 'hello'],
];
所以如果你去
myArray[0]
你得到第一个元素,它是一个数组,然后你去那个数组的第一个元素,它是未定义的。
这就是为什么
alert(myArray[0][0]);
输出未定义。