资讯专栏INFORMATION COLUMN

JS中函数参数值传递和引用传递

ZHAO_ / 2164人阅读

摘要:学习中函数参数值传递和引用传递的学习中函数参数值传递和引用传递在红宝书中说到,中所有函数的参数都是按值传递的。

学习JS中函数参数值传递和引用传递的学习 JS中函数参数值传递和引用传递

在JavaScript红宝书中说到,“ECMAScript中所有函数的参数都是按值传递的”。理解这个概念先要从JS的堆内存和栈内存说起:栈内存为自动分配的内存空间,它由系统自动释放;堆内存则是动态分配的内存,大小不定也不会自动释放。(很初级的理解,有错误还望指正)

JS中的5种基本数据类型Undefined、Null、Boolean、Number 和 String,它们是直接按值存放在栈内存中,可以直接访问。引用类型的值是保存在堆内存中的对象。与其他语言不同,JavaScript不允许直接访问堆内存中的位置, 也就是说不能直接操作堆内存中的对象。 在操作对象时, 实际上是在操作对象的引用(也可理解为指针)而不是实际的对象。” 这个堆内存中对象的引用(指针)存储在栈内存中。你只能操作栈内存中的数据。即基础类型数据和堆内存中对象的指针两大类

对于基本数据类型的复制就相当于你和小明买了一辆一样的单车,你对自己单车的操作不会影响到小明的单车。
而对于引用类型的复制,相当于你和小明共用一个客厅,你对这个客厅做的操作是会影响到小明的客厅(即你们共用的客厅)

如下图:

 //测试代码:
    //基本类型:
    var a = 10;
    var b = a;
    b = 12;
    alert(a);//10
    alert(b);//12
    
    //引用类型:
    var a = new Object();
    a.name = "Tony";
    alert(a.name);//"Tony"
    var b = a;
    b.name = "Tom"
    alert(a.name);//"Tom"
参数的传递

继续说参数的传递,无论参数是什么类型,都是按值传递的,普通类型传递的是本身的值,引用类型传递的是自己在栈内存中的“指针”值。

function setName(obj) {
    obj.name = "Nicholas";
}
var person = new Object();
setName(person); 
alert(person.name);   // "Nicholas"

实际过程如下图

...]

//而有一个容易引起误导的点在于下面这个变化
function setName(obj) {
obj.name = "Nicholas";
obj = new Object(); //改变obj的指向,此时obj指向一个新的内存地址,不再和person指向同一个
obj.name = "Greg";
}
var person = new Object();
setName(person);  
alert(person.name);  //"Nicholas"
//这里只要理解,你不能直接操作堆内存中的对象,你只能通过栈内存中的指针进行操作。

这个函数的过程如下图:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88871.html

相关文章

  • JavaScript参数传递方式

    这几天遇到js参数传递方式的问题,深切探究一番,将所得结果总结于此 常见的几种传递方式 传值调用(call by value) 在传值调用中实际参数被求值,其值被绑定到函数中对应的变量上(通常是把值复制到新内存区域)。在函数返回后调用者作用域里的曾传给函数的任何东西都不会变。 传引用调用(call by reference) 在传引用调用求值中,传递给函数的是它的实际参数的隐式引用(即实际参数的地...

    jcc 评论0 收藏0
  • JavaScript之按传递

    摘要:中所有函数的参数都是按值传递的。基本类型本身是按值传递,具有不可变性,对基本类型的修改,实质上都是在栈内存中创建了新的值。中把这种拷贝也认为是按值传递。 本文共 1200 字,读完只需 5 分钟 概述 参数的传递分为按值传递和按引用传递,而 JavaScript 中参数的传递只有按值传递。 ECMAScript 中所有函数的参数都是按值传递的。 所谓按值传递就是: 把函数外部的值复制给...

    xiangchaobin 评论0 收藏0
  • js 函数参数传递引用类型与基本类型

    摘要:基本类型和引用类型用操作符定义的变量将成为作用域中的局部变量。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量即命名参数。结果依旧是在调用函数初时,与引用的是同一对象,所以首次的属性赋值会对有所影响。 函数 参数 1.js函数不介意传递进来多少个参数,也不在乎传递进来参数是什么类型。2.arguments对象:类数组 arguments对象的长度是由传入的参数个数决定的,...

    Lavender 评论0 收藏0
  • js 函数参数传递引用类型与基本类型

    摘要:基本类型和引用类型用操作符定义的变量将成为作用域中的局部变量。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量即命名参数。结果依旧是在调用函数初时,与引用的是同一对象,所以首次的属性赋值会对有所影响。 函数 参数 1.js函数不介意传递进来多少个参数,也不在乎传递进来参数是什么类型。2.arguments对象:类数组 arguments对象的长度是由传入的参数个数决定的,...

    Bowman_han 评论0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享传递传递

    摘要:它对数组和对象使用按值传递,但这是在的共享传参或拷贝的引用中使用的按值传参。例如在这里,变量和值在执行期间存储在堆栈中。返回值这是可选的,函数可以返回值,也可以不返回值。变量被推入堆栈,从而在执行时成为的副本。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 22 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可...

    keithyau 评论0 收藏0

发表评论

0条评论

ZHAO_

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<