威尼斯www.9778.com-威尼斯正版官方网站

javascript中的变量是传值还是传址的?_javascript技巧_脚本之家

日期:2019-12-25编辑作者:服务器&运维

这个标题念起来有点拗口,但却是理解数据结构的关键。标题中的4个术语,对应的英文分别是:shallow copy、deep copy、pass by value、pass by reference。传址和传引用是一回事。 一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型和可变类型。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于不可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,堆内存和栈内存分别用于保存不可变类型值和可变类型值。 什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如: 复制代码 代码如下: window.onload=function() { var stringValue = "淡淡的"; var anotherStringValue = stringValue; stringValue = "I have changed"; alert;// 输出 I have changed alert;// 输出 淡淡的 此时,anotherStringValue中保存的值会不会也变成“I have changed”?不会。因为 var anotherStringValue = stringValue; 照stringValue中保存的字符串的原样,复制一个字符串,并将该字符串赋给anotherStringValue。换句话说,这两个变量虽然保存的值相同,但它们的值并不在一块内存中。因此,修改任何一个变量,都不会影响另一个变量。即 stringValue = “I have changed”; 只会影响stringValue的值。但是,确切来讲,stringValue = “I have changed”;并不是修改stringValue,而是创建了一个新字符串,然后让stringValue引用该字符串——更像是替换变量的值;原来的字符串呢?因为没有变量引用它,也就成为垃圾了。 由此可见,赋值操作对于不变类型而言,传递的是内存中的值本身。那么,对于可变类型呢?当然,传递的是内存中值的引用,而且无论传递多少次,内存中始终都只有一份原始值——毕竟可变类型大小莫测,只保存一份原始值能最大限度节省内存空间。例如: 复制代码 代码如下: window.onload=function() { var objectValue = {1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}}; var anotherObjectValue = 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中,给函数传递参数是按照上述默认约定——即对不可变类型,传值;对可变类型,传址——进行的。如: function example{ …… } example(stringValue,objectValue); 调用example函数时,第一个参数传递的是实际的字符串值,第二参数传递的是对象的引用。

本文由威尼斯www.9778.com发布于服务器&运维,转载请注明出处:javascript中的变量是传值还是传址的?_javascript技巧_脚本之家

关键词:

javascript设计模式之单体模式

单人体模型式 单体是在剧本加载时创建的,能将风流罗曼蒂克层层有关系的变量和措施组织为一个逻辑单元,逻辑单...

详细>>

比较详细的javascript DOM 学习笔记第1/2页_javascript技巧_脚本之家

DOM添加元素,使用节点属性 元素(你应该明白这是该文件的document元素),你可以使用document的documentElement特性:varo...

详细>>

JS 事件绑定函数代码_javascript技巧_脚本之家威尼斯www.9778.com

主要解决了 浏览器兼容,现在可以兼容IE6 7 8 FF 谷歌IE浏览器里,this指向问题。 直接上代码吧! 复制代码 代码如下...

详细>>

javascript browser浏览器类型以及版本判断代码_javascript技巧_脚本之

return borwser比如当前浏览器类型是ie6.0,那么borwser的值应该是[“ie”,"6","6.0"]数组的第一个值表示浏览器的类型,第二...

详细>>