起因是在逛sf的时候看到这样一个问题
var arr=[1,2];
var arr0=[{a:1,b:2}];
function fun(data){
data = arr0
}
fun(arr);
console.log(arr) //[1,2],这里的arr的值为什么没有变?
一看这个问题,似懂非懂。后经讨论和高人指定,画了下内存图,感觉瞬间清晰了。和大家分享下,欢迎指正!
初始的内存分布,形参变量存在栈中,对象存在堆内。如图,栈中有arr,arr0,还有fun的形参data三个变量,分别指向了堆中的两个数组对象的首地址。
执行fun(arr);,将arr数组对象的首地址作为实参传入fun中,此时,data的指向发生变化,指向了arr数组对象的首地址。如图,
最后console.log(arr);,输出arr,由于arr依然指向的是原来的arr数组对象,所以输出没有变化。
那么,再看下另外的情况
var arr=[1,2];
var arr0=[{a:1,b:2}];
function fun(data){
data[0] = 3;
data[1] = 4;
}
fun(arr);
console.log(arr) //[3,4],这里的arr的值为什么又变了呢?
直接开始fun(arr);,data指向arr数组对象的首地址,拿到了arr对象的操作权限。方法内部,data对arr数组对象的值进行了修改(暂不考虑越界的问题)。结果如图,
所以最后arr被改变了。
两种代码不同的地方是,一个没改变对象本身,只是指针发生了变化。另一个是用心的指针操作了对象,所以原指针指向的数据就发生了变化。另外存在引用传递和值传递的误区。
连接:https://segmentfault.com/a/1190000022166306
JavaScript 的内存管理和垃圾回收,是个略生僻的话题,因为在JavaScript 中不显式执行内存操作,不过最好了解它如何工作。
js具有自动回收垃圾的机制,即执行环境会负责管理程序执行中使用的内存。在C和C++等其他语言中,开发者的需要手动跟踪管理内存的使用情况。在编写js代码时候,开发人员不用再关心内存使用的问题,所需内存的分配 以及无用的回收完全实现了自动管理。
javaScript内存空间并不是一个经常被提及的概念,想要对JS的理解更加深刻,就必须对内存空间有一个清晰的认:栈与堆、复杂数据类型与基本数据类型、引用数据类型与堆内存
实际上并不是新建一个和原对象(数组也是对象)完全一样的对象,而是把原对象的内存地址直接复制给了另一个对象,也就是说两个对象都是指向同一个内存地址,所以实际上它们就是同一个对象。
php垃圾回收机制,对于PHPer来说是一个不陌生但是又不是很熟悉的内容。那么php是怎么实现对不需要的内存进行回收的呢?首先还是需要了解下基础知识,便于垃圾回收原理内容的理解。
JavaScript变量可以用来保存两种类型的值:基本类性值和引用类性值。所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题
计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的。应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的库函数 向操作系统申请内存。
当项目以tab页签方式打开多个iframe窗口时,关闭tab页签同时也需要关闭iframe并释放内存资源,主要是针对IE浏览器。
今天遇到一个很有争议的问题,在这里分享一下,我相信对于即将面试前端的小伙伴会有帮助的。主要内容是围绕下边的问题展开的,文章涉及到的其他方面的知识点不展开叙述。
随着 Web 应用复杂程度越来越高,以及 NodeJS 大规模投入生产环境,许多 Web 应用都会长时间运行, JavaScript 的内存管理显得更为重要。JavaScript 具备自动回收垃圾的机制
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!