JavaScript数组在向其推送值之前跟踪为具有值

JavaScript数组在向其推送值之前跟踪为具有值,javascript,arrays,Javascript,Arrays,我正在做一个项目,跟踪网站上点击的链接。我正在尝试将单击的链接存储在本地存储对象中。为了能够处理代码中的链接,我创建了一个本地数组,从本地存储中获取URL(单击的链接) 在一些调试过程中,我注意到本地数组在实例化之后,在将值推送到它之前,就有一个值 代码: 我在浏览器控制台中看到的是: 在我将url推入数组之前,数组中的索引0处似乎已经存在一个值。我正试图追踪一个特定的错误,我不知道这是否是导致错误的原因,因此我想了解这里发生了什么,以防它确实是我试图修复的错误的原因。要查看差异,请尝试以下方

我正在做一个项目,跟踪网站上点击的链接。我正在尝试将单击的链接存储在本地存储对象中。为了能够处理代码中的链接,我创建了一个本地数组,从本地存储中获取URL(单击的链接)

在一些调试过程中,我注意到本地数组在实例化之后,在将值推送到它之前,就有一个值

代码:

我在浏览器控制台中看到的是:


在我将url推入数组之前,数组中的索引0处似乎已经存在一个值。我正试图追踪一个特定的错误,我不知道这是否是导致错误的原因,因此我想了解这里发生了什么,以防它确实是我试图修复的错误的原因。

要查看差异,请尝试以下方法:

console.log("before instantiation");
var clickedLinksArtTest=[]

log(“实例化后”)

log(“推url之前”)

日志(“clickedLinksArrTest”,clickedLinksArrTest.slice(0))

clickedLinksArrTest.push(本地存储[“clickedLinks”])

log(“推url后”)


日志(“clickedLinksArrTest”,clickedLinksArrTest)

将鼠标悬停在小的
i
图标上。当对象被记录时,控制台并不总是善于维护对象的状态。如果您在第一个日志后退出代码,它将为空。@SLaks它表示“下面的值刚刚计算过”。这是什么意思?在处理控制台日志之前,浏览器是否“预先计算”数组将包含哪些值?我不熟悉可变/不可变的概念。我现在正在阅读,但我还没有完全理解它。我尝试了你的代码,它确实清除了数组。但这在实践中意味着什么?这是否意味着我每次实例化一个数组时都必须执行一个切片操作,以确保它在被赋值之前没有值?可变性/不可变性的概念究竟如何解释我在浏览器控制台中看到的内容?在处理控制台日志之前,浏览器是否“预先计算”数组将保留哪些值?是否删除了关于可变/不可变的备注?若然,原因为何?它到底与这个问题无关吗?是的,我删除了它,因为它在本例中并不完全是突变。当您执行此操作时,就会发生变异
array1=[];阵列2=阵列1。。。在这种情况下,每当您更改阵列1时,此更改也将在阵列2中执行(突变)。。因为它们指向内存中的同一引用。当您尝试查看数组的状态“在按下之前”时,在控制台中也会看到相同的情况。console.log只显示阵列的当前状态。要想看到差异,首先必须将该数组的当前状态复制到e副本中。好的,我现在理解了可变性指的是什么,但我仍然不清楚浏览器日志中发生了什么。您说
console.log
显示数组的当前状态,但由于我在推送值之前跟踪它,该状态不应该是
length=0
并且索引0处没有值吗?不,当前状态是数组的最后一个状态;]。您可以看到,推送前数组的日志似乎是空的,因为它显示
clickedLinksArrTest>[]
,但当您单击“>”查看数组的内容时,您会看到它不是空的;]。。。那是因为参考文献
console.log("before instantiation");