手机版
网站地图
美文美图
最新动态
你好,欢迎访问
好美文阅读网
个性皮肤
搜索
网站首页
美文
文章
散文
日记
诗歌
小说
故事
句子
作文
签名
祝福语
情书
范文
读后感
文学百科
美文摘抄
节日文章
名家散文
网名大全
座右铭
口号大全
面试技巧
说说大全
阅读答案
诗词默写
流言蜚语
节日祝福
好句子
经典台词
谚语大全
亲情故事
友情故事
表白情书
工作报告
活动总结
心得体会
专题汇总
美文网首页
js/jquery 学习笔记
js/jquery 学习笔记
作者:
夜消雨霁
| 来源:发表于
2019-10-24 22:59 被阅读0次
理解JavaScript中的堆和栈
这里先说两个概念:1、堆(heap)2、栈(stack)堆 是堆内存的简称。栈 是栈内存的简称。说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。javascript的基本类型就5种:Undefined、Null、Boolean、Number和String,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。javascript中其他类型的数据被称为引用类型的数据 : 如对象(Object)、数组(Array)、函数(Function) …,它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间传值与传址
vararr1 = [1,2,5,8]; vararr2 = arr1 ; varstr1 = arr1[2];
console.log(arr2); //1,2,5,8
console.log(str1); //5
arr2[4] =99; str1 =6;
console.log(arr1); //1,2,5,8,99
console.log(arr1[2]); //5
上方例子得知,当我改变arr2中的数据时,arr1中数据也发生了变化,当改变str1的数据值时,arr1却没有发生改变。为什么?这就是传值与传址的区别
因为arr1是数组,属于引用类型,所以它赋予给arr2的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象的值。str1得到的是一个基本类型的赋值,因此,str1仅仅是从arr1堆内存中获取了一个数值,并直接保存在栈中。arr1、arr2都指向同一块堆内存,arr2修改的堆内存的时候,也就会影响到arr1,str1是直接在栈中修改,并且不能影响到arr1堆内存中的数据。
js中深度拷贝和浅拷贝
对于字符串类型,浅复制是对值的复制,对于对象来说,
浅复制是对对象地址的复制
,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,
而深复制则是开辟新的栈
,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
1、使用递归的方式实现深拷贝
var obj1 = {
a : { b : 10 }
};
/*function copy(obj){ //浅拷贝
var newObj = {};
for(var attr in obj){
newObj[attr] = obj[attr];
}
return newObj;
}*/
function deepCopy(obj){ //深拷贝
var newObj = {};
if(typeof obj != 'object'){
//console.trace();
return obj;
}
for(var attr in obj){
newObj[attr] = deepCopy(obj[attr]);
}
//console.trace();
//console.log(newObj);
return newObj;
}
var obj2 = deepCopy(obj1); //深拷贝
//第一层循环为 obj2=deepCopy(obj1)----->newObj[a]=deepCopy(obj1[a])=deepCopy({b:10})------->newObj[a]=
//第二层循环为 newObj[b]=deepCopy({b:10}[b])=deepCopy(10)=10------->newObj[b]=10------->return newObj={b:10}
//newObj[a]={b:10}------>return newObj=a:{b:10}
// obj2.a.b = 20;
alert(obj2.a.b); //10
alert(obj1.a.b); //10
2、通过 JSON 对象实现深拷贝
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
deepClone(myobj);
3、通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4];var newArray = $.extend(true,[],array);
其它插件、库提供的方法等等
相关文章
网友评论
本文标题:
js/jquery 学习笔记
本文链接:
https://www.haomeiwen.com/subject/xgbyhftx.html
延伸阅读
那年盛夏诗歌
环境监察队工作总结范文
优秀教师学习心得范文
华胥引的读后感300字
《Its red》教学反思范文
农资购销的合同范本
竞选中队委优秀演讲稿
辞金蹈海的成语解释
《世纪宝鼎》公开课教案设计
因为爱你,所以牵挂
今生今世红尘醉——美到
一个90后的内心独白
致已逝去的高中年华
深度阅读
您也可以注册成为美文阅读网的作者,发表您的原创作品、分享您的心情!
情人节
母亲节
重阳节
清明节
端午节
植树节
元宵节
妇女节
愚人节
圣诞节
父亲节
教师节
儿童节
劳动节
青年节
建军节
万圣节
平安夜
光棍节
中秋节
国庆节
感恩节
腊八节
更多话题
栏目导航
摄影
故事
互联网
读书
旅行
热点阅读
晒童诗:谁说文学创作不需要数学思维?
我的塔罗日记2018.4.7.12
遇到困难,积极寻求社会支持
生命中的那个昙花,也曾一现。(续)
2018年4月6号
投资异类王利杰
我所拥有的最宝贵的财富是什么?
那些牛人的时间管理方法,我们真的需要吗?
交互细节-NO.4
运营中心一季度总结
网友评论