javascript中的变量是传值还是传址的?
JavaScript变量 还是 传值
2023-06-13 09:14:18 时间
这个标题念起来有点拗口,但却是理解数据结构的关键。标题中的4个术语,对应的英文分别是:shallowcopy(注意,不是shadowcopy)、deepcopy、passbyvalue、passbyreference(或passbyaddress)。传址和传引用是一回事。
一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于不可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,堆内存和栈内存分别用于保存不可变类型值和可变类型值。
什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如:
复制代码代码如下:
一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于不可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,堆内存和栈内存分别用于保存不可变类型值和可变类型值。
什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如:
window.onload=function()
{
varstringValue="淡淡的";
varanotherStringValue=stringValue;
stringValue="Ihavechanged";
alert(stringValue);//输出Ihavechanged
alert(anotherStringValue);//输出淡淡的
此时,anotherStringValue中保存的值会不会也变成“Ihavechanged”?不会。因为
varanotherStringValue=stringValue;
照stringValue中保存的字符串的原样,复制一个字符串(相应地,在内存中分配一块新空间),并将该字符串赋给anotherStringValue。换句话说,这两个变量虽然保存的值相同,但它们的值并不在一块内存中。因此,修改任何一个变量,都不会影响另一个变量。即
stringValue=“Ihavechanged”;
只会影响stringValue的值。但是,确切来讲,stringValue=“Ihavechanged”;并不是修改stringValue,而是创建了一个新字符串(相应地,在内存中分配一块新空间),然后让stringValue引用该字符串——更像是替换变量的值;原来的字符串呢?因为没有变量引用它,也就成为垃圾了(当然,垃圾所占用的内存会被回收)。
由此可见,赋值操作对于不变类型而言,传递的是内存中的值本身。那么,对于可变类型呢?当然,传递的是内存中值的引用(或者说地址),而且无论传递多少次,内存中始终都只有一份原始值——毕竟可变类型大小莫测,只保存一份原始值能最大限度节省内存空间。例如:
window.onload=function()
{
varobjectValue={1:1,"s":"string","innerObject":{"innerArray":[1,2,3]}};
varanotherObjectValue=objectValue;
objectValue[1]=100;
alert(anotherObjectValue[1]);//输出100
}
不言自明,这里的anotherObjectValue通过赋值操作,从objectValue那里只获得了对原始对象({1:1,"s":"string","innerObject":{"innerArray":[1,2,3]}})的引用,也就是该对象在内存中的地址,或者说“门牌号码”。因此,通过objectValue修改原始对象的第一个元素(objectValue[1]=100;),结果同样会在anotherObjectValue[1]那里得到反映——因为这两个变量共享同一份原始值。
在JavaScript中,给函数传递参数是按照上述默认约定——即对不可变类型,传值;对可变类型,传址——进行的。如:
functionexample(str,obj){
……
}
example(stringValue,objectValue);
调用example函数时,第一个参数传递的是实际的字符串值,第二参数传递的是对象的引用(内存地址)。
相关文章
- javascript 基础_JavaScript高级编程
- ajax 面试题_javascript面试题大全
- 【说站】JavaScript成员查找机制是什么
- JavaScript:冒泡排序
- 面试官:能用JavaScript手写一个bind函数吗1
- JavaScript学习总结(二十)——Javascript非构造函数的继承详解编程语言
- JavaScript学习总结(十七)——Javascript原型链的原理详解编程语言
- javascript中的location用法简单介绍
- 实例学习Javascript之构建方法、属性
- JavaScript入门教程(9)Document文档对象
- javascript简练的几个函数
- 用Javascript验证表单(form)中多选框(checkbox)值
- var与Javascript变量隐式声明
- JavaScript变量命名规则
- Javascript结合css实现网页换肤功能
- JavaScript输入框内容格式验证代码
- JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- 一个简单的JavaScript数据缓存系统实现代码
- JavaScript中为元素加上name属性的方法
- php和javascript之间变量的传递实现代码
- javascript将数组插入到另一个数组中的代码
- javascript通过navigator.userAgent识别各种浏览器
- javascript匿名函数实例分析
- javascript实现的HashMap类代码