我在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();
该方法在控制台中输出对象,然后修改数组中的值。但是在更改值之前对象的输出表明该值已经更改。
我正在寻找为什么发生这种情况的解释,或者是解释的链接。如果需要,请在评论中要求澄清。我很乐意提供我忽略的任何细节。
我正在处理的项目中的数组是一个大型的多维数组,这种行为会导致意外的结果。对不起,我没有任何想法或研究要分享。我不知道该搜索什么不能给我JavaScript数组的基础知识。我以为我知道JavaScript数组和对象是如何工作的,但这让我很难过。
答案 0 :(得分:3)
控制台的工作原理 - 当您记录完整(未展开)对象时,您会在展开时看到其属性的值,而不是在对象时被记录了。所以,在你的情况下,你得到的是真实的,因为它同时成了现实。
没有"修复"为此,除了可能在记录对象时对对象进行字符串化,但是当您需要准确表示变量时,请确保记录变量本身,而不是其父对象。
它与数组和对象的行为方式相同,只要您的数组/对象嵌套得足够深,以便控制台可以折叠它,请注意:
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;

打开控制台,将它们展开,然后在同一个控制台行中看到矛盾(false / true)。