美文网首页
JavaScript参数按值传递的理解

JavaScript参数按值传递的理解

作者: ascend13 | 来源:发表于2017-08-31 19:14 被阅读0次

看到一个这样的问题

function setName(obj) {
  obj.name = "Tom";
  obj = new Object();
  obj.name = "Greg" ;
}

var person = new Object();
setName(person);
alert(person.name);  //"Tom"

按照一般的理解第二次重写name属性会覆盖原先的name,输出应该是"Greg"才对。
这个问题其实就是高程书上的原题,高程书的一些地方看了很多遍,但是每次重看都还是会有新的理解,这里理解的关键在于JavaScript函数的参数是按值传递的。
之前只是粗泛的了解参数按值传递,但是却并没有搞清楚本质,结合高程书和知乎的这个回答链接才对这个问题算是真正理解了。

栈内存与堆内存

简单类型的值,它们的值直接存储在变量访问的位置,这是因为这些简单类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。每次复制都是一个单独的副本,之间相互独立

var num1 = 5; 
var num2 = num1; 

图示


Alt text

引用类型的值存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

var obj1 = new Object(); 
var obj2 = obj1; 
obj1.name = "Nicholas"; 
alert(obj2.name); //"Nicholas" 

图示


Alt text

ECMAScript中所有函数的参数都是按值来传递的

其实ECMAScript函数参数实际上是函数的局部变量,因此本题中将一个对象作为参数传入时,复制了一个指针指向对象在堆内存中的内存地址。按值复制传递上复制了一个指针变量,这个变量是按值传递的。
在调用函数内部将一个新的Object赋给obj之前内存情况是这样的:

Alt text
如果是按引用传递,就会直接把第一个(也就是变量本身)整个传递进去(就不会有第二格的存在了)
再将新的Object赋给obj之后:
Alt text
可以看到obj指向新的Object内存地址,而person引用的仍然是原来的Object,并且在函数内部新建的局部对象会在函数执行完毕后销毁,因此打印的name是第一个。
原文地址

参考书籍

《JavaScript高级程序设计》

相关文章

  • 2019-06-26

    深入理解JavaScript 参数按值传递 定义:ECMAScript中所有函数的参数都是按值传递的。 值传递:函...

  • 值传递or引用传递

    javascript都是按值传递 javascript的函数的参数传递,传递的都是值,参数是 Object 类型的...

  • 数据结构与算法 javascript

    基础概念 javascript中,函数的参数传递方式都是按值传递,没有按引用传递的参数。但是javascript中...

  • 再学JS--函数参数传递类型

    JavaScript的函数参数传递分为按值传递、按引用传递以及按共享传递。 按值传递 什么是按值传递? 把函数外部...

  • JavaScript参数按值传递的理解

    看到一个这样的问题 按照一般的理解第二次重写name属性会覆盖原先的name,输出应该是"Greg"才对。这个问题...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

  • JavaScript函数的参数传递

    JavaScript函数的参数传递取决于参数的类型: 若参数为基本类型,那么按值传递 若参数为引用类型,那么按共享...

  • 方法参数

    一、参数传递 1.参数传递有两种类型:按值传递和按引用传递。 2.按值传递指变量使用的是参数传递的值,而按引用传递...

  • [JS开发者应懂的33个概念]3. 值类型和引用类型

    JavaScript 之 函数参数的传递 按值传递 继上篇说的,JavaScript的基本数据类型有7种:null...

  • 按值传递与按引用传递

    按值传递 -- 传递的是参数的值,即参数本身。 按引用传递 -- 传递的是指向参数的值的引用(指针),而不是参数的...

网友评论

      本文标题:JavaScript参数按值传递的理解

      本文链接:https://www.haomeiwen.com/subject/fymqjxtx.html