首页 > 试题广场 >

请问关于以下JS代码中说法正确的是() const arr1

[不定项选择题]
请问关于以下JS代码中说法正确的是()
const arr1 = new Array(2);
const arr2 = [undefined, undefined];
const arr3 = Array.apply(null, {length: 2});
arr1.map((value, index) => {
    return index;
});
arr3.map((value, index) => {
    return index;
});
  • 执行arr1.join('.')结果是空字符串" "
  • 执行arr2.join('.')结果是" . "
  • arr1执行map操作后的返回值是[empty,empty]
  • arr3执行map操作后的返回值是[0, 1]
**核心知识:稀疏数组 (hole) vs 显式元素 (undefined)** ```js const arr1 = new Array(2); // 长度为 2 的稀疏数组,内部是 2 个 hole const arr2 = [undefined, undefined]; // 含 2 个显式的 undefined const arr3 = Array.apply(null, {length: 2}); // 等同于 [undefined, undefined],同样是“实值” ``` JavaScript 中「空槽 (hole)」与「值为 undefined 的元素」行为不同: | 方法 | 遇到 hole 时 | 遇到 undefined 时 | |------|--------------|-------------------| | `Array.prototype.map` | **跳过** 回调,不生成对应位置的新元素 | 正常调用回调 | | `Array.prototype.join` | 把当前元素当成空字符串 `''` 参与拼接 | 把元素值(`undefined` 会转成空字符串 `''`)参与拼接 | --- ### 逐条判断选项 #### A. `arr1.join('.')` 结果是空字符串 `""` ❌ `arr1` 长度为 2,因此 `join` 会在两次空字符串之间插入分隔符 `'.'`: ```js ''. + '.' + '' // 结果为 "." ``` 结果是 `"."`,而不是空字符串,所以 **A 错误**。 #### B. `arr2.join('.')` 结果是 `"."` ✅ `arr2` 的两个 `undefined` 会被当成空字符串参与拼接,同样得到 `"."`,因此 **B 正确**。 #### C. `arr1` 执行 `map` 后返回 `[empty, empty]` ✅ `map` 对稀疏数组不会执行回调;返回的新数组保持同样的 hole: ```js arr1.map(()=>{}) // [empty × 2] ``` 因此 **C 正确**。 #### D. `arr3` 执行 `map` 后返回 `[0, 1]` ✅ `arr3` 里有“真实”的 `undefined` 元素,`map` 会被调用两次,返回索引: ```js arr3.map((v, i) => i) // [0, 1] ``` 因此 **D 正确**。 --- ### 小结 - **稀疏数组 (hole)**:`new Array(len)` 生成;迭代方法跳过 hole。 - **显式 undefined**:`[undefined]` 或 `Array.apply(...)` 生成;迭代方法正常处理。 - `join` 无论是 hole 还是 `undefined`,都会当作空字符串拼接,只要数组长度 > 1,都会出现分隔符。 所以本题的正确选项是 **B、C、D**。
发表于 2025-04-28 12:05:30 回复(0)