今天回答了一个关于 Javascript 的问题,涉及到了赋值问题,因此想把这个问题好好总结下。
var a = 'test'; var b = function() {}; b.a = 'test'; function change(m, n) { m = 'change'; n.a = 'change'; } change(a, b);
执行上述代码后,变量 a 和 b 的值会发生改变吗?
原始值和引用值
在 之前的文章中介绍过原始值和引用值,原始值指的 Undefined, Null, Boolean, Number, String 等,它们存放在栈中,而引用值则集成自 Object,它被存放在堆中。
这里要把两者区分清楚:
var a = 'test'; var b = new String('test'); var A = 'true'; var B = new Boolean('true');
以上四个变量,a 和 A 为原始值,而 b 和 B 则为引用值。
赋值机制
清楚了原始值和引用值的区别后,就可以具体介绍 Javascript 的赋值机制:
在 Javascript 中,对于原始值类型的变量,每次赋值都将生成一份拷贝,而对于引用值,则正如其名,是通过引用赋值,指向同一个存储对象的内存处。
原始值的赋值:
var a = 1;//原始值 var b = a;//生成一份拷贝给变量 b b = 2;//与 a 无关 alert(a);//输出 1
引用值的赋值:
var A= new Object();//引用值 A.x = 1; var B = A;//引用赋值,指向同一个内存处 B.x = 2;//修改 B 将影响 A alert(A.x);//输出 2
参数传递
现在我们来看看传递两种类型的值给函数形参时时怎么处理的。
1.传递原始值
var a = 1; function test(m) { m = 2; } test(a); alert(a);//输出 1
输出为1,所以我们知道函数只是将变量的值传递进去了,所以在函数体内的 m 得到传来的值1,再被赋值为2,这个过程不影响外部的变量 a。
2.传递引用值
var A= new Object(); A.x = 1 function test(M) { M.x = 2; } test(A); alert(A.x);//输出 2
输出为2,所以我们知道函数将变量的地址传递进去了,所以函数体内的 M 得到传递来的地址,因此属性 x 被赋值为2的同时也会影响指向同一内存地址的 A。
总结
现在再回到开篇的问题:
var a = 'test'; var b = function() {}; b.a = 'test'; function change(m, n) { m = 'change'; n.a = 'change'; } change(a, b);
变量 a 为原始值,变量 b 为引用值,传递进函数体内一个为值,一个为地址,所以函数运行后,变量 a 不会改变,而变量 b 的值将会改变。
本文向大家介绍详解javascript new的运行机制,包括了详解javascript new的运行机制的使用技巧和注意事项,需要的朋友参考一下 和其他高级语言一样javascript 中也有new 运算符,我们知道new 运算符是用来实例化一个类,从而在内存中分配一个实例对象。 但在 javascript 中,万物皆对象,为什么还要通过new 来产生对象? 本文将带你一起来探索 javascr
本文向大家介绍详解JavaScript事件循环机制,包括了详解JavaScript事件循环机制的使用技巧和注意事项,需要的朋友参考一下 众所周知,JavaScript 是一门单线程语言,虽然在 html5 中提出了 Web-Worker ,但这并未改变 JavaScript 是单线程这一核心。可看HTML规范中的这段话: To coordinate events, user interaction
本文向大家介绍javascript继承机制实例详解,包括了javascript继承机制实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript继承机制。分享给大家供大家参考。具体分析如下: 初学javascript一般很难理解Javascript语言的继承机制它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的
本文向大家介绍Javascript 引擎工作机制详解,包括了Javascript 引擎工作机制详解的使用技巧和注意事项,需要的朋友参考一下 Javascript 引擎工作机制 javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈、全局对象、执行环境、变量对象、活动对象、作用域和作用域链等,这些概念正是JS引擎工
JAVA中关于变量赋值的机制(值传递机制) 1.如果变量是基本数据类型,此时赋值的是数据的实际值,即实参传递给形参的是实参的值 2.如果变量是引用数据类型,此时赋值的是保存数据的地址值,即实参传递给形参的是实参的地址
本文向大家介绍详解PHP变量传值赋值和引用赋值变量销毁,包括了详解PHP变量传值赋值和引用赋值变量销毁的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PHP变量传值赋值和引用赋值变量销毁的具体代码,供大家参考,具体内容如下 php中,上面的代码,变量是怎么存放的呢? 上面的代码变动下,将变量b赋值给变量a,会发生什么? 问题来了,$a = $b,那么是将变量a的指针指向了变量b指针所