在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值
根据数据类型不同,有的变量储存在栈中,有的储存在堆中。具体区别如下:
原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始变量互不影响。
引用值是把 引用变量的名称储存在栈中,但是把其实际对象储存在堆中,且存在一个指针由变量名指向储存在堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针, 此时 两者指向的 是同一个数据,若通过方法改变其中一个变量的值,则访问另一个变量时,其值也会随之加以改变;但若不是通过方法 而是通过 重新赋值 此时 相当于 重新开了一个房间 该值的原指针改变 ,则另外一个 值 不会随他的改变而改变。
看示例:
var a="hello"; var b=a; a="world"; alert(a);//world alert(b);//hello var arr=[1,3]; arr1=arr; arr.push(5); alert(arr)//1,3,5 alert(arr1);//1,3,5 arr=[7,8]; alert(arr);//7,8 alert(arr1);//1,3,5
用图来表示 结果如下:
原始变量的值互不影响,引用变量arr和arr1指向的为同一对象,所以当对arr通过方法改变其值时(堆房间里的数据发生变化),访问arr1的数据时就会访问到改变后的对象
通过非方法来改变引用变量的值时,会为该引用变量重新创建一个堆房间,此时指针也会发生变化:
总结:
Number、Stirng、Boolean、Null、Underfined这些基本数据类型,他们的值直接保存在栈中;
Object、Function、Array、Date、RegExp这些引用类型,他们的引用变量储存在栈中,通过指针指向储存在堆中的实际对象
以上所述是小编给大家介绍的JS中原始值和引用值的储存方式示例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍js实例属性和原型属性示例详解,包括了js实例属性和原型属性示例详解的使用技巧和注意事项,需要的朋友参考一下 详情请仔细研读注释,这里就废话少说,直接上代码了。 小伙伴们是否看明白了,了解了实例属性和原型属性了吗?本文讲述的非常的详细,推荐给大家,希望对小伙伴们能有所帮助
问题内容: 我了解以下错误的原因: 它不会编译。表达式始终导致。因此,我们应该进行显式转换: 但是 我不明白为什么以下是正确的 : 因为文字整数(例如3或8)始终隐式为。而且表情总是导致过。谁能解释这是怎么回事? 我唯一能猜到的是编译器将此表达式等同于以下内容: 并且不认为这是一个表达式。 问题答案: 这有 少† ,无论是否做评估,以在编译时间, 更 要与事实的编译器是明确允许隐式窄s到在某些情况
本文向大家介绍原生js获取left值和top值的三种方法,包括了原生js获取left值和top值的三种方法的使用技巧和注意事项,需要的朋友参考一下 在用js做动态效果时,通常需要获取元素绝对定位中的left和top属性值。比如做一个碰撞广告,就要不停的获取元素的top和left属性值。 需要注意的事:取值的元素必须要设置position:absolute绝对定位属性,才能取的到left值。 第一种
本文向大家介绍JavaScript数据操作_浅谈原始值和引用值的操作本质,包括了JavaScript数据操作_浅谈原始值和引用值的操作本质的使用技巧和注意事项,需要的朋友参考一下 我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值。 首先明确,值和类型是两个不同的概念。例如,
问题内容: 我正在使用ng-options从下拉列表中选择值。我希望能够将旧值与新值进行比较。ng- change非常适合抓住下拉菜单的新值,但是如何同时获得新值和原始值? 例如,假设我希望控制器记录以下信息:“您以前的user.name是BILL,您的当前用户名是PHILLIPE。” 问题答案: 使用有角的{{expression}},您可以将原先的user或user.id值作为文字字符串添加到
enum 原始值 枚举成员可以用相同类型的默认值预先填充(称为原始值) e.g. enum ASCIIControlCharacter: Character { case tab = "\t" case lineFeed = "\n" case carriageReturn = "\r" } 当在操作存储证书或字符串原始值枚举的时候, 不必显示的给每一个成员都分配一个原始