【问题标题】:Where can I find info on the behavior of arrays within objects in JavaScript?在哪里可以找到有关 JavaScript 对象中数组行为的信息?
【发布时间】:2015-12-19 19:41:21
【问题描述】:

我在 JavaScript 对象中有一个数组,它的行为方式我无法解释。

代码是:

var board = {
    val: [false],
    init: function() {

        console.log(board);      // when expanded, console says board.val[0] = true
        console.log(board.val);  // console says board.val[0] = false

        board.val[0] = true;
    },
};

board.init();

该方法在控制台中输出对象,然后修改数组中的值。但是值改变之前的对象的输出表明值已经改变了。

我正在寻找关于为什么会发生这种情况的解释,或解释的链接。如果需要,请在 cmets 中要求澄清。我很乐意提供我忽略的任何细节。

我正在处理的项目中的数组是一个大型的多维数组,这种行为会导致意外结果。很抱歉,我没有任何想法或研究可以分享。我不知道要搜索什么并没有给我 JavaScript 数组的基础知识。我以为我知道 JavaScript 数组和对象是如何工作的,但这让我很困惑。

【问题讨论】:

  • 刚刚测试了你的代码,它(正确地)输出'false'。您是在特定浏览器中还是在 NodeJS 中进行测试?
  • 数组本身不能为真或假。你的例子没有意义。
  • board.val 是一个数组。你应该测试 board.val[0]。为什么不简单地分配 board.val = false 而不是 board.val = [false] ?
  • 建议将行改为:“console.log(board.va[0]);”而是为您提供数组第一个元素的值。
  • @Martin,我正在 Chrome 中进行测试。为了清楚起见,console.log(board); 表明 board.val[0] = false

标签: javascript arrays object


【解决方案1】:

这就是控制台的工作方式 - 当您记录一个完整的(未展开的)对象时,您会看到它的属性值在您展开它时,而不是在记录该对象时。所以,在你的情况下,你得到了 var true 因为它同时变成了真实的。

对此没有“修复”,除了在记录对象时可能对对象进行字符串化,但是当您需要准确表示变量时,请确保记录变量本身,而不是其父对象。

它与数组和对象的行为方式相同,只要您的数组/对象嵌套足够深以使控制台折叠它,请注意:

var arr = [[false]];
var obj = {sub: {subsub: false}};
console.log(arr, obj, JSON.stringify(arr), JSON.stringify(obj));

arr[0][0] = true;
obj.sub.subsub = true;

打开控制台,将它们都展开,您会在同一控制台行中看到矛盾(假/真)。

【讨论】:

  • 谢谢!这帮助很大。
  • 没问题,很高兴能帮上忙。
猜你喜欢
  • 2012-08-10
  • 2023-03-18
  • 1970-01-01
  • 2010-09-25
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多