为何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
相关产品推荐
相关产品推荐

