var numbers = [45, 4, 9, 16, 25];
var txt = [];
console.log(txt);
for (var x in numbers) {
txt[x] = numbers[x];
}
在上述代码中for in在遍历前打印了一下需要遍历的空数组,打印出来的是空数组,但空数组的下面在控制台上显示有遍历数组的元素,请问这是怎么回事?还请各位大shen解惑!
打印这个对象的语句执行的时候, 对象里面的确是空的,
但是当程序继续执行,下面的代码是有对这个对象赋值的语句,所以chrome控制台显示,里面有值,
可以在打印这个对象语句上设置断点,然后执行一句,此时去看控制台,就是你想要的结果
console.log 在浏览器中输出的是变量引用地址的内存快照,当点击左侧这个小箭头时,浏览器会根据当前引用类型变量的内存地址去读取变量的值
和forin循环并没有关系,JS中对象是引用类型,每次使用对象都是调用了对象在堆中的引用,console.log打印的是对象当时的快照,展开对象时,它其实是重新去内存中读取对象的属性值,这个时候对象的赋值已经完成,所以说后续开发过程中打印对象并不可靠,断点调试更好一点。
console.log 打印出的内容是动态变化的,如果想要真实打印,可以使用JSON.stringfiy序列化后输出。
js数组是引用类型,所以你打印的那个数组空间在下边的代码发生了变化,跟着你打印的就变了。这么理解,txt得到的只是一个地址,链接这个地址的是一个空间,当向这个空间放东西和取东西的时候,所有引用这个空间地址的都会跟着变化。
你打印的时候txt是空的,但是你下面又给这个txt赋值了,这个时候txt会出现值
这里面存在了变量提升的含义,你可以看一下这篇文章,理解一下什么是变量提升,就可以理解了
https://blog.csdn.net/qq_44291585/article/details/121437954?spm=1001.2014.3001.5502
如果有帮助,解答你的疑惑请点个采纳哟!
多谢各位的解惑!!!