Array(100).map(x => 1) 的结果是什么?

Array(100).map(x => 1) 创建的是空数组,而不是包含 100 个 1 的数组。了解 map 方法如何处理空槽对理解 JavaScript 数组行为至关重要。

JavaScript 困难 数组 映射 map

Array(100).map(x => 1) 的结果是 一个包含 100 个空槽(empty slots)的数组,而不是包含 100 个 1 的数组。具体表现如下:

🧠 原因解析

  1. Array(100) 创建的是空槽数组
    Array(100) 只设置了数组的 length 为 100,但没有初始化任何索引属性(相当于 [empty × 100])。

  2. map 方法会跳过空槽
    map 只对已赋值的元素执行回调函数(空槽被视为 undefined 但不会触发回调):

    const arr = Array(100);   // 创建 [empty × 100]
    arr.hasOwnProperty(0);     // false(索引0未初始化)
    

🔍 验证结果

const result = Array(100).map(x => 1);
console.log(result); 
// 输出: [empty × 100](控制台显示)
console.log(result.length); // 100
console.log(0 in result);   // false(索引0无值)

✅ 正确创建含 100 个 1 的数组

需先初始化数组元素,常用方法:

// 方法1: fill + map
Array(100).fill(null).map(() => 1);

// 方法2: Array.from(推荐)
Array.from({ length: 100 }, () => 1);

// 方法3: 使用 fill 直接赋值(最简单)
Array(100).fill(1);

⚠️ 特殊注意

若强行访问空槽元素,会得到 undefined,但 map 仍不会处理:

const emptyArr = Array(100);
console.log(emptyArr);  // undefined
console.log(emptyArr.map(x => 1)); // undefined(未被修改)

💎 总结

表达式 结果 原因
Array(100).map(x=>1) [empty × 100] map 跳过未初始化的元素
Array(100).fill(1) [1, 1, 1, ... , 1] fill 初始化了所有元素