【问题标题】:Array object gets removed from list before splice() statement (JS)数组对象在 splice() 语句(JS)之前从列表中删除
【发布时间】:2019-03-18 13:59:27
【问题描述】:

免责声明:这是学校实验室作业的一部分

更新:我想保留它以供将来参考,所以我将删除代码部分。感谢所有帮助过的人!你帮了大忙

作业(总和):使用包含 30 个名人对象的数组,用 HTML/JS 创建一个名人照片猜谜游戏。

当前状态:我正处于检查用户猜测的部分。用户猜测在function checkUserGuess() 中调用。如果匹配,那么我调用displayOutPut("correct")("incorrect") 作为下一个函数function displayOutput(result) 的参数。它接受result 参数并在switch 语句中检查它。为了争论,我关心的代码是“不正确”的情况而不是“正确的”,因为我不知道这些名人的大多数面孔。为了测试目的,我故意弄错了。

(随机选择名人:查理卓别林)

观察:(根据我的屏幕截图)似乎名人数组已经删除了查理,尽管它在控制台中读取数组的大小为 30。这是在我之前splice查理出阵。 washedupCelebs 数组确实收到了 Charlie。并且,第三个数组显示了名人数组,删除了 Charlie,大小更改为 29。

截图:https://i.stack.imgur.com/prtHk.png

console.log 的顺序是什么:

  • randomCelebrity对象
  • celebrities 删除使用过的名人之前的数组
  • 当前名人的索引
  • washedupCelebs数组存储使用过的名人
  • celebrities 删除当前名人后的数组

问题:splice 发生之前删除查理有什么原因吗?我应该担心这个吗?我觉得这没什么大不了的,但我宁愿得到一些关于它的意见,这样我才能继续前进。该功能似乎工作正常,但它看起来像是在某种程度上被窃听了。

注意事项: - 有同学看到这个帖子的机会,我不想要 他们窃取了我的代码。我会在几个小时后删除这篇文章 出于同样的原因。 - 还有一件事,我知道我的教授是这里的版主,所以如果你看到这个,我很乐意删除它并亲自给你发电子邮件。不知道你是否介意我这样做,因为我并没有要求任何人真正为我完成任务。

代码:

因可能的复制而被删除

【问题讨论】:

  • 为什么不使用索引而不是对象。那么你不需要查找(这有效)。那你为什么在你已经有一个函数的时候使用更多的随机部分呢?另一个问题,对于索引或作为键,您不需要字符串。还有一些,不要相信控制台,它可能看起来像时间旅行。
  • 顺便说一下,这是 Rita Ora 而不是 Rite Ora
  • ...您在> { .. } 行中看到的是对象/数组的外观当您记录它时,您通过单击> 看到的是数组现在的样子(尼娜提到的时间旅行)
  • 这里有点related issue
  • @JonasWilms 我没有暗示这是一个骗局。我知道这不是骗子。我要说的是两者是相关的(它们都归结为控制台显示对象/数组的错误状态的事实)。

标签: javascript arrays splice


【解决方案1】:

TLDR:不要相信控制台。

如果您记录一个对象/数组,它会被序列化(变成一个字符串)并且该序列化版本会打印到控制台中:

  console.log([1, 2]); // [1, 2]

现在对于更长的数组/嵌套对象,完整的序列化可能会导致打印很长的字符串,这需要时间。此外,那个长字符串可能并没有真正的帮助(你看不到森林里的树)。因此控制台只序列化了数组的一小部分,例如

 Array(30) [...]

它只为您提供基本信息,只是数据类型 (Array) 长度 (30) 和内容被省略 ([...])。

所以实际上没有魔法,在splice 之前数组长度是30,之后是29


现在有一个有用但令人困惑的>。因为有时候缩写序列化不足以调试,你需要完整版。问题是,当您单击> 时,控制台不再知道对象/数组在您记录时的外观。因此它序列化对象的当前状态 / 大批。因此,在展开的部分中,您会看到两次拼接出来的版本,因为在您点击 > 时它已经被拼接出来了。


现在要拿到当时的序列化版本,要么自己序列化:

 console.log( JSON.stringify(array) );

或克隆数组以存储其状态:

 console.log( array.slice() );

【讨论】:

  • 这是一个完美的解释。我现在知道了。我很高兴我没有做错任何事
  • 有用但令人困惑的> 在行动中:i.stack.imgur.com/f6WTT.jpg
  • @ibrahim UI 的设计没有考虑到用户。我从来没有点击过那个按钮,而且我想我不是唯一一个
  • 是的,确实如此。有趣的事实:我在制作屏幕截图时偶然发现了它。
【解决方案2】:

看起来你刚刚开始使用 JS。

嗯,我觉得一切都很好。

原因是console.log在登录控制台时使用了对数组的REFERENCE。

名人在拼接前没有从代码中删除。

当您调用 splice 时,名人会被删除,并且所有引用该数组的 console.log 都会显示最新值。

console.log(celebrities.length) --> 30

.

console.log(celebrities.length) --> 29
celebrities.splice(index, 1);

我建议您在调试器中运行代码以更好地了解正在发生的事情。

【讨论】:

  • 是的,正如 Nina 和 Jonas 所说,我现在开始明白“时间旅行”的含义。但是我对 Javascript 有点熟悉,无论如何我都不是专家,但我从来没有使用过控制台来测试我的代码。这是我开始更经常使用的东西。不幸的是,由于上学期的一些老师问题,这是我的第二个学期。基于 C# 组件的设计之上。我不得不选择我的优先事项。
  • 在您的示例中,控制台将记录 30 两次。
  • 谢谢,我已将 console.logs 分开以避免混淆。第一个不带拼接,第二个带拼接。
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多