Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

值传递 #11

Open
wweggplant opened this issue Sep 25, 2023 · 0 comments
Open

值传递 #11

wweggplant opened this issue Sep 25, 2023 · 0 comments

Comments

@wweggplant
Copy link
Owner

javascript中,变量不想其他的编译型语言有严格的类型,而是采用的比较松散的类型,这样的好处是比较灵活,即便是在整个生命周期,也可以改变变量的类型,带来的缺点附带了更加复杂的情况,容易出问题。

前置知识——基本类型和变量类型

基本类型主要就是UndefinedNullBooleanNumberString。引用类型是对象Object,在引用类型中,我们可以在其中动态的添加属性。

var obj = new Object();
obj.name = 'John'
console.log(obj.name)

复制变量值

当多个变量指向同一个变量的时候,是把值的副本分别赋给了所有的变量,需要注意的是基本类型和引用类型复制的目标的不同。基本类型复制的是值本身,而引用类型复制的是引用指针的副本。我们来看具体的例子,外加对内存进行辅助分析。

var n = 5;
var m = n;

以上的代码在内存中的是这个样子的,基本类型直接保存在栈内存中,多个变量相互引用同一个基本类型,就是在栈内存中复制该变量。

变量名 栈内存 堆内存
n 5
m 5
var obj = { value: 1 }
var foo = obj

obj赋值一个引用对象的时候,栈内存里保存的是这个引用对象的地址指针值,堆内存里保存的实际的对象。

变量名 栈内存 堆内存
obj {value:1}的指针 {value:1}

当运行完var foor = obj的时候,内存示意图如下,变量foo实际是指向的一份obj的副本,也就是另一份{value:1}obj一样的指针

变量名 栈内存 堆内存
obj {value:1}的指针 {value:1}
foo {value:1}的指针

以上就后面要讲的按值传递的基础,有了这些知识,再看下面就很简单了。

函数参数传递

在下面的这段代码中,foo函数内部修改外部obj的属性value的值,并且我们通过验证发现外部的obj的属性确实被修改了。

var obj = {
  value: 1
}
function foo(obj) {
  obj.value = 2
  console.log(obj, 'foo') // {value: 2} "foo"
}
console.log(obj, 'global') // {value: 2} "global"

这段代码的关系图可以表示成下图,也就是说外部的objfoo函数的内的obj都通过各自的指针,指向了同一个对象,然后foo内对obj进行属性操作其实就是对真实对象进行操作,看起来就好像obj就是真实的对象。

obj ---> refence ---->{value: 1} <---- refence <-------obj(foo中)
@wweggplant wweggplant changed the title 按值传递 值传递 Sep 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant