You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript中Array.apply(null,[1])生成含empty的数组?

好问题!这些数组细节确实容易踩坑,咱们逐个拆解清楚:

1. 什么是数组里的「empty」?

首先明确:empty并不是一个变量,它是浏览器控制台(比如Chrome DevTools)用来标记数组中「未被初始化的索引位置」的特殊显示。

当你创建一个「稀疏数组」(也就是数组的某些索引位置从未被赋值,或者索引不连续)时,就会出现这种情况。比如new Array(1),它会生成一个长度为1,但索引0从未被赋值的数组:

  • 控制台显示为[empty]
  • 访问Array.apply(null,[1])[0]会返回undefined(因为JS对未定义的属性默认返回undefined)
  • 但它和直接赋值undefined的数组[undefined]有本质区别:
    • Object.keys([empty])返回[](未初始化的索引不会被视为数组对象的属性)
    • [empty].forEach(() => console.log('触发'))不会执行任何回调(遍历会跳过empty位置)
    • 而[undefined].forEach(() => console.log('触发'))会正常输出一次触发

2. 为什么Array.apply(null,[1])得到[empty],而Array.apply(null, [1,2])得到[1,2]?

先回忆Function.prototype.apply的核心作用:它会把第二个参数(数组/类数组)的元素展开成单个参数,传给目标函数。而Array作为构造函数时,调用逻辑分两种情况:

  • 如果传入单个数字参数n(且n是正整数):创建一个长度为n的稀疏数组,所有索引位置都是empty
  • 如果传入多个参数(或单个非数字参数):把参数直接作为数组元素,生成普通数组

那对应你的问题:

  • Array.apply(null, [1]) → 相当于调用Array(1),符合第一种情况,所以得到长度1的稀疏数组[empty]
  • 你问题里写的Array(null,[1,2])其实会返回[null, [1,2]],我猜你可能是笔误,应该是Array.apply(null, [1,2])?这个调用相当于Array(1,2),属于第二种情况,所以直接生成包含1和2的数组[1,2]

3. console.log(Array.apply([1]))和console.log(Array.apply([1]).length)的结果?

apply方法的第二个参数如果省略,会默认传入undefined,此时apply不会给目标函数传任何参数。而Array构造函数在没有参数的情况下,会生成一个空数组[]。

另外,这里的第一个参数[1]是Array构造函数执行时的this,但Array作为构造函数时,不管this是什么,都会返回一个新的数组实例,所以不影响最终结果。

所以:

  • console.log(Array.apply([1])) → 控制台输出[]
  • console.log(Array.apply([1]).length) → 控制台输出0

内容的提问来源于stack exchange,提问作者The Intellectual

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:46:39