javascript中变量重新赋值和引用重新赋值问题

宋晨      2022-02-14     255

关键词:

javascript中经常会遇到这样的问题:

 
var a=3;
var b=a;
a=5;
; //结果为5;
; //结果为3;
 
而在下面的代码中情况却发生了变化:
 
var a=1,b=2,c=3;
var Array=[a,b,c];
a=5;
;  //结果为1,没有发生变化;
 
 
var a=1,b=2,c=3;
var Array=[a,b,c];
Array[0]=5;
; //结果为1,a没有发生变化
 
在接下来的代码中情况又不同:
 
var a=1,b=2,c=3;
var Array=[a,b,c];
Array2=Array;
Array[0]=5;
; //结果为5;
 
 
var a=1,b=2,c=3;
var Array=[a,b,c];
var Array2=Array;
Array2[0]=5;
; //结果为5;
 
接下来解释上面代码执行结果不同的原因:
首先是栈和堆的问题,栈中储存的是基本类型的变量和对象的引用,它们的值直接存放在栈中;而堆中储存的是复杂的数据类型,例如数组对象和Object对象,他们的引用变量存储在栈中,指向存储在堆中的实际对象。
 
发生上面情况的原因是栈中的数据可以共享,在第一段代码中,a=3执行的时候栈中为值3分配了空间,而b=a的时候,b=3,关键是当a的值改变为5之后b的值却没有改变,这就是因为栈中数据可以共享的原因。假如执行a=3,b=3;a=3执行时为3分配了内存,那么b=3的时候不会在栈中分配内存存储3这个值,而是让b去指向已有的3,当a=5的时候,程序去寻找栈中有没有5这个值,如果有则让a去指向5,如果没有则重新分配内存存储5,显示在上面的例子中,a=5重新分配了内存,a此时指向了5,而b指向的值是3,并不会因为a的值的改变而改变。
 
在第二段程序中使用了数组,数组是存储在堆中的,当创建一个数组时,在堆中创建了一个数组对象,而在栈中创建了对数组的引用,指向存储在堆中的实际对象。所以当Array=[a,b,c]执行后,Array[0]=1,Array[1]=2,Array[2]=3;当a的值改变即a=5执行时,a先去检查栈中有没有5这个值,如果有则a直接指向5,如果没有则分配内存存储5,a指向5,但Array[0]的值并没有因此发生改变; 而Arrry[0]=5执行时,实际更改的是堆中的数据,不影响栈中a的值。Array=[a,b,c]相当于将a,b,c的值复制到了堆中。
 
在第三段程序中,Array2=Array,当Array的值发生改变时,实际更改的是堆中的对象,所以一个值改变,则两个数组对应的值都改变

javascript变量赋值和参数传递

先上结论!变量赋值:  基本类型:按照值传递(也就是会复制一份)  引用类型:按照引用传递(也就是会传递对象的引用)参数传递  基本类型:按照值传递(也就是会复制一份)  引用类型:按照值传递(也就是... 查看详情

2.go的变量和常量

go的变量和常量 GO的变量: 变量的声明: 先对变量进行声明,在对其赋值varvariableNametypevariableName=typeValuevarnumberint number=3如果该变量只是单纯的声明却没有对其赋值:int:默认为0string:默认为""float:+0.000000e+000直接... 查看详情

为什么为const变量重新赋值不是个静态错误

const和let的唯一区别就是用const声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错:constfoo=1foo=2//TypeError:Assignmenttoconstantvariable.注:本文不会使用“常量”这个术语,因为我觉的这个术语容易有歧义:有些... 查看详情

python属性重新赋值叫啥

...始化,自动调用了obj的init函数,声明了一个对象A的私有变量,并对其赋值。这时候的A.a就是访问了一个对象的私有变量。对其赋值,没有调用任何其他方法,和b=“test”一样,就是普通的对字符串赋值,这个时候,a就是一个对... 查看详情

第2章重新组织函数:引入解释性变量分解临时变量和移除对参数的赋值

5.引入解释性变量(IntroductExplainingVariable)//引入解释性变量//重构前if((platform.toUpperCase().indexOf("MAC")>-1)&&(browser.toUpperCase().indexOf("IE")>-1)&&wasInitialized()&&resize>0 查看详情

js中赋值和变量的问题(代码片段)

...f1a;vara=xxx,a内存中到底保存的是什么?赋值和变量的问题问题:vara=xxx,a内存中到底保存的是什么?//问题:vara=xxx,a内存中到底保存的是什么?/* *XXX是基本数据,保存的就是这个数... 查看详情

php中unset一个变量之后,通过引用赋值引用这个变量的变量会被unset吗?

在php中变量的赋值分为按值赋值, 和引用赋值.在按值赋值中,$a=val; $b=$a;可以看成$a=val;$b=val;变量b被赋予a的值之后, a和b便没有任何的引用关系了,此时改变其中任意一个值,另外一个值不会受到影响.在引用传值种,$a=val;$b... 查看详情

局部变量和全局变量

变量作用域:全局变量和局部变量1)作用范围不一样全局变量在模块里都能用,包括函数中也可以用局部变量只作用于函数2)当全局变量和局部变量同名时,函数优先使用局部变量3)局部变量没有时,会使用全局变量4)在函数内... 查看详情

详解php变量传值赋值和引用赋值变量销毁

参考技术A本文实例为大家分享了PHP变量传值赋值和引用赋值变量销毁的具体代码,供大家参考,具体内容如下<?php$a=100;$b=200;var_dump($a,$b);//int(100)int(200)?>php中,上面的代码,变量是怎么存放的呢?上面的代码变动下,... 查看详情

javascript使用rest结构赋值与rest运算符重新分配数组元素(代码片段)

查看详情

kotlin语法学习(代码片段)

Kotlin语法学习(一)变量和函数变量在Kotlin中定义变量的方式和java有很大的区别,在java中有很多的基本类型和一些引用类型,但是在Kotlin中定义一个变量只允许在变量前面声明两个关键字:val和varval(value的简写)用来声明一个不可变的... 查看详情

shell变量重新赋值问题

#!/bin/shbdate=$(date+%Y%m%d)bl=falsereadFile()catfilename.txt|whilereadlinedostr=$line##*/if[$bdate=$str];thenecho$bdate"Filealreadyexists.Doyouwanttooverwritetheexistingfile?"echo"Pleaseenterayesorno:"bl=trueecho"x=$bl"//打印的是x=true#readoperbreakfidone<filen... 查看详情

c++tbb::atomic<bool>声明读取重新赋值

声明//原子变量,isWarnedTimeout变量设置为false,保证线程安全tbb::atomic<bool>isWarnedTimeout(false);读取isWarnedTimeout.load()重新赋值isWarnedTimeout.store(true); 查看详情

javascript用html给变量赋值

...rt title here</title> <script type="text/javascript"> /*I总结: 1.函数名可以做变量使用,可以赋值,可以传值 2.函数名当参数,传递给另一个函数 */ //==================js中函数的两种定义方式... 查看详情

javascript变量赋值

在js中经常会遇到将一个变量赋值给一个新的变量这种情况,这对于基本类型很容易去实现,直接通过等号赋值就可以了,对于引用类型就不能这样了。(注:像函数,正则也可以直接通过等号赋值)这里我写了一个复制值的函... 查看详情

javase面向对象编程之final

...可以为private,但是无意义;final方法不能重写)  c.实例变量(获得初始值后不能重新赋值。可以定义时就给赋值,也初始化代码块赋值,也可以构造数赋值。不能不赋值,赋值后也不能重新赋值)  d.类变量(获得初始值后不... 查看详情

python中变量的引用、可变和不可变类型、局部变量和全局变量

参考技术A变量的引用变量和数据都是保存在内存中的变量和数据是分开存储的数据保存在内存中某个位置,通过地址来标记变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置把变量保存数据地址的过程称为引... 查看详情

关于变量重新申明的一点问题

...的地址还是外部传入的fooconsole.log(foo.a);//1foo.a=3;//和外部变量地址 查看详情