变量、值、地址和Javascript参数之间的关系
的1.javascrip变量包含两种类型的值,一个是引用类型的值,和其他的基本类型的值,引用类型包括:数组、对象、功能(这是可以理解的,非基本类型都是引用类型);5种基本类型包括:undefined空字符串、布尔、数。
2参数传递的机理。函数是复制变量的值。
书中说:将函数外部的值复制到函数内部的参数中,并将值从一个变量复制到另一个变量。基本类型的转移与基本类型变量的副本相同,而引用类型与引用类型变量的副本相同。
当一个变量复制引用类型的值,变量中存储的对象的值的副本也被分配到新的变量的空间复制的。不同的是,这个值的副本实际上是一个指针,指针指向的对象存储在堆中,在复制操作说完,两变量实际上指的是同一个对象,所以改变一个变量会影响另一个变量。
{注释:复制引用类型的值是地址)
3。参数实际上是函数的局部变量。
不是
基本概念的解释:
传输值:传递A到B的值,改变B,A不会改变,B是和A相同的值;
地址:发送A到B的地址,改变B,A同时改变,B只是A的地址(类似于计算机的快捷方式)。
值类型(值类型)数据存储在堆栈中的变量中,也就是说,内存空间是在堆栈中分配的,并且值是直接存储的,并且值由数据本身来表示。值类型的数据具有更快的访问速度。
一个引用类型数据(引用类型)不居住在栈中,而是存储在堆中。它是在堆中分配内存空间,不直接存储所蕴含的价值,但点的值被存储,其值表示的地址是直接访问的。数据引用类型时,您需要检查该变量的内容在堆栈,它是指在堆一个真实的数据,数据率的引用类型的数据类型具有较大的存储容量和存取速度较低。
不是
这里有三个问题。
问题1:为什么在A(a)函数执行后,外部A没有干扰
var = { 1, 2, 3 };
函数更改(a){
console.log(一); / / {1,2,3}
a = 2; /
console.log(一); / / 2
}
改变(a);
console.log(一); / / {1,2,3}
问题1答:因为改变(A)以这种方式执行,对象A(数组)首先传递给改变,并被复制到参数A的变化。然后A = 2是赋值语句,它变成一个值。A = 2此时是一个值类型,并且不涉及引用地址的问题。因此它不影响外部A。
问题2:为什么在更改(a)函数执行后外部受到干扰
var = { 1, 2, 3 };
函数更改(){
a = 2; /
}
变化();
console.log(一); / / 2
2答:执行变更时,()函数时在其执行环境的寻找范围链,活动对象(活动对象)不包括变量,然后在作用域链中找到,找到全局执行环境,找到变量,所以在这个时间函数的内部和外部的一个一个内存地址一样,自然的功能,内部的变化,外部将遵循。
解析:问题2和问题1之间的区别在于问题2不引入参数,因此它不涉及复制变量。
问题3:为什么在更改(a)函数执行后外部受到干扰
var = { 1, 2, 3 };
函数变化(b){
b { 0 } = 2;
}
改变(a);
console.log(一); / / { 2,2,3 }
问题3答:这个和问题1非常相似,但只有不同的是A = 2,变为0 { } = 2,我一开始很困惑,不是说复制吗参数B应该是一个拷贝值,它如何影响外部
事实上,当执行更改函数时,参数B是A的拷贝值,因为A是一个引用类型,函数的内部是由B和a通过引用访问的地址对象。b 0 { }=2的外观不影响b和a在函数中引用的同一对象。
问题4:为什么在A(A)函数执行之后,外部A没有受到干扰
var = { 1, 2, 3 };
函数变化(b){
console.log(B); / / {1,2,3}
b=2;
b { 0 } = 2;
}
改变(a);
console.log(一); / / {1,2,3}
问题4答:变化(B)的执行过程是这样的,一个对象通过改变功能和拷贝到注2地址的值,当B是值类型,它没有解决地址参考问题。之后,B { 0 } = 2实际上是没有意义的,因为B不是数组的那一刻,自然没有这样的索引方式B { 0 }。所以B和实际上消失后,B = 2.at此时外面仍然是{ 1,2,3之间的地址引用关系};
以上是本文的全部内容,希望大家能喜欢。