为什么我必须在这种情况下使用传播语法?
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
。
我正在尝试解决这个 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
。