函数 returns [object Set] 而不是实际的 Set

Function returns [object Set] instead of an actual Set

我有一个功能

function recursiveDivisionWrap(width, height, colStart, colEnd, rowStart, rowEnd)

其中我有一个空集

let blockedNodes = new Set();

在这个函数中我有另一个递归函数

function recursiveDivision(width, height, colStart, colEnd, rowStart, rowEnd)

每次调用 recursiveDivision 函数时,我都会通过添加值来更新 blockedNodes 集:

for (let i = colStart; i < colEnd; i++) {
        blockedNodes.add(`c${i}r${wallStart}`);
      }

如果我 console.log blockedNodesrecursiveDivision 函数中设置,我' m 得到想要的结果,例如:

Set(43) {'c0r7', 'c1r7', 'c2r7', 'c3r7', 'c4r7', …}

然而,当我 console.log blockedNodes 设置在 recursiveDivisionWrap 而不是recursiveDivision,我将得到逗号分隔的对象:

c0r7,c1r7,c2r7,c3r7,c4r7,c5r7,c6r7,c7r7,c8r7,c9r7,c9r0,c9r1,c9r2,c9r3,c9r4,c9r5,c9r6,c8r0,c8r1,c8r2,c8r3,c8r4,c8r5,c8r6,c3r0,c3r1,c3r2,c3r3,c3r4,c3r5,c3r6,c4r6,c5r6,c6r6,c7r6,c4r1,c5r1,c6r1,c7r1,c4r5,c5r5,c6r5,c7r5

我也试过数组,结果是一样的。

为什么 return Set(43) {'c0r7', 'c1r7', 'c2r7', 'c3r7', 'c4r7', …} 如果 blockedNodes 集是在 recursiveDivision 函数和内部 recursiveDivisionWrap 为什么内部 recursiveDivision 函数 return 设置正确? 如果能帮助我找到该问题的答案,我将不胜感激。

此行为与生成输出的位置无关,而与输出的格式有关。

您有这些陈述:

console.log(blockedNodes);

并且:

console.log(`Is this a set? ${blockedNodes}`);

并且:

let ecie = Array.from(blockedNodes);
console.log(`Is this an array? ${ecie}`)

他们不做同样的事情。

console.log(blockedNodes) 将渲染留给 console API,这可能会提供额外的信息,例如对象构造函数的名称(在本例中为 Set ), 这个集合的物品数量, ...等等.它甚至可以将用户界面控件添加到 expand/collapse 集合的内容和潜在的嵌套数据结构。

console.log(`Is this a set? ${blockedNodes}`) 将隐式调用 blockedNodes.toString() 以生成字符串。除非 toString 已被覆盖,否则将呈现为 [object Set],因此总输出将是“这是一个集合吗?[object Set]”。

console.log(`Is this an array? ${ecie}`) 也会调用 toString 方法,但这次是在 ecie 上,它是一个数组(因为那是 Array.from 返回的)。数组上的 toString 方法生成逗号分隔的值列表,这解释了您提到的输出。