为什么我必须在这种情况下使用传播语法?

Why do I have to use the spread syntax in this case?

我正在尝试解决这个 leetcode 问题:https://leetcode.com/problems/subsets/

这是有效的代码:

function subset(set) {
    const result = [];

    helper(set, 0, [], result);
    return result;
}

function helper(set, i, slate, result) {
    if(i === set.length) {
        result.push([...slate]);
        return result;
    }

    // exclude i
    helper(set, i+1, slate, result);
    // include i
    slate.push(set[i]);
    helper(set, i+1, slate, result);
    slate.pop();
}

subset([1,2,3])

此处为这一行:

result.push([...slate]);

为什么我把它改成result.push(slate)result.push(...slate),尽管slate本身是一个数组,但都不起作用?

对于result.push(slate)的情况:这是因为数组是通过引用存储在JavaScript中的,所以当我在这里做 slate.pop();时,它也会弹出被推入的项目进入结果数组?

但是,我不理解另一种情况 (result.push(slate)),因为在这种情况下似乎是推入了各个项目,而不是包含每个项目的数组。这是为什么?

你对第一种情况确实是正确的,但对于你的第二种情况,因为 Array.prototype.push 的签名是

arr.push([element1[, ...[, elementN]]])

这是一个可变参数函数(一个可以接受无限数量参数的函数)。所以当你打电话给

// given slate = [1,2,3]
result.push(...slate);
// is the same as calling
result.push(1,2,3)

因为您的数组 slate 被“分散”到 push 的各个参数中。这会将 1,2,3 作为单独的数组元素添加到 result

通话中

// given slate = [1,2,3]
result.push([...slate]);
// is the same as calling
result.push([1,2,3])

这在您的情况下是正确的,会将数组 [1,2,3] 作为单个元素添加到 result