传播运算符的缺失值

missing values from spread operator

let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
function fun()
{
    console.log(arguments)
}
const fun1 = (...n) =>{
    console.log(n)
}
fun.call(...arr1, ...arr2)

输出:[对象参数] { 0: -2, 1:3, 2:4, 3:8, 4:3, 5:-8, 6:1 }

fun1.call(...arr1,...arr2)

输出:[-2、3、4、8、3、-8、1]

arr1 和 arr2 加起来有 8 个值,但输出只有 7 个值,为什么? 如何获取所有值?

因为您已经使用 Function.prototype.call 调用 fun,并且 call 的第一个参数不是 传递的参数到 fun,它是在调用期间用作 this 的值。所以第一个值不会出现在 fun 看到的参数中(它是 this 的值,如果这是松散模式代码,则包装在对象包装器中)。

没有理由在您的示例中使用 fun.call,只是:

fun(...arr1, ...arr2);

但如果您出于某种原因需要我们 call,您将指定一个不同的第一个参数(在调用期间用作 this):

fun.call(nullOrWhateverYouWantThisToBe, ...arr1, ...arr2);

(旁注:在现代 JavaScript 中,几乎没有任何理由使用 arguments 伪数组。改为使用剩余参数,这会为您提供一个真正的数组。)

有了这些变化:

let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
function fun(...args) {
    console.log(`args.length = ${args.length}`);
    console.log(`args:`, args);
}

fun(...arr1, ...arr2);