资讯专栏INFORMATION COLUMN

js函数中参数的传递

rubyshen / 1295人阅读

摘要:前言今天再看纯函数的时候看到纯函数过程没有副作用就是说在纯函数中我们不能改变外部状态想到了以前看过的函数中传参的概念数据类型在中数据类型分为两类基本类型值和引用类型值变量的复制中变量的基本类型和引用类型保存方式是不同的这也就导致变量复制时也

前言

今天再看React纯函数的时候,看到纯函数过程没有副作用,就是说在纯函数中我们不能改变外部状态.
想到了以前看过的函数中传参的概念.

数据类型

在js中,数据类型分为两类:基本类型值(undefined,null,Boolean,Number,String)和引用类型值(Object,Arrat,Function).

变量的复制

1.js中变量的基本类型和引用类型保存方式是不同的,这也就导致变量复制时也就不同了.
如果从一个变量向另一个变量复制基本类型的值时,会将前者的值克隆一个,然后将克隆的值
赋值到后者,因此这两个值是完全独立的,只是他们的value相同而已.

var num1 = 10;
var num2 = num1;
console.log(num1); // 10
num2 += 1;
console.log(num1);  // 10
console.log(num2);  // 11

2.引用类型的复制
引用类型复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了.
将obj1的值复制给obj2,而这个值的副本实际上是一个指针,这个指针指向存储在堆中的一个对象,
也就是说创建了一个新的内存地址传给了obj2,obj1和obj2两个变量同时指向了同一个Object,当去改变这个对象,
他们的值都会改变,也即是说他们中任何一个做出的改变都会反映到另一个身上.

var obj1 = {
    a: 1
};
var obj2 = obj1;
console.log(obj2);  // {a: 1}
obj2.a = 10;
console.log(obj1);  // {a: 10}
console.log(obj2);  // {a: 10}
函数参数的传递

所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制
到另一个变量一样.所以如果能理解变量的复制,那么参数的传递也就很简单了.
1.基本类型传参

var count = 10;
function num(num1) {
    num1 = 1;
    return num1;
}
var count1 = num(count);
console.log(count1); // 1
console.log(count); //10

2.引用类型传参

var o = {
    a: 1
};
function fun(o) {
    o.a = 10;
    return o;
}
var p = fun(o);
console.log(o); // {a: 10}
console.log(p); // {a: 10}

3.引用类型传参指针改变
在函数中重新定义了一个对象,也就是现在堆内存中有两个对象,外部的oo指向的是老的对象,被传入参数后
指向的是新定义的对象,所以调用后返回的值是新定义的对象的值.
如果参数是按引用传递的,那么oo也是a:10,从这点可以看出参数是按值传递的.

var oo = {
    a: 1
};
function gun(o) {
    o = {
        a: 10
    };
    return o;
}
var pp = gun(oo);
console.log(oo);    // {a: 1}
console.log(pp);    // {a: 10}
总结

函数的参数是值传递,对象类型作为参数的时候传递的是地址(指针)的值,而不是对象本身堆内存中的value.
所以这种场景,函数内部用参数去修改对象,那么查找到的还是原对象,因为指向相同,所以修改的话原对象
也受影响.
如果实例化一个对象赋值给该指针,那么指针指向的是一个全新的对象了,和原来指向的对象失去联系.

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

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

相关文章

  • js函数参数、作用域、匿名函数总结

    摘要:在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。当在函数内部重写时,这个变量的引用就是一个局部变量了,这个局部变量在函数执行完毕后立即销毁。 前言:我入门学的 java这种强类型语言,刚开始学js第一感觉是挺简单,后来发现还是too young。所以,本次就把作用域、匿名函数做一个完整总结,黑喂狗~~~ --------...

    BakerJ 评论0 收藏0
  • JS函数参数传递和引用传递

    摘要:学习中函数参数值传递和引用传递的学习中函数参数值传递和引用传递在红宝书中说到,中所有函数的参数都是按值传递的。 学习JS中函数参数值传递和引用传递的学习 JS中函数参数值传递和引用传递 在JavaScript红宝书中说到,ECMAScript中所有函数的参数都是按值传递的。理解这个概念先要从JS的堆内存和栈内存说起:栈内存为自动分配的内存空间,它由系统自动释放;堆内存则是动态分配的内存...

    ZHAO_ 评论0 收藏0
  • JavaScript求值策略

    摘要:关于的求值策略,问中函数的参数传递是按值传递还是按引用传递回答很经典。所以不能说中函数的参数传递严格按值传递或按引入传递。中还采用一种参数传递策略,叫按共享传递。中参数是必须先求值再作为实参传入函数的。参考求值策略中函数参数的默认值 最近在研究 lambda 演算中的 η-变换 在 JavaScript 中的应用,偶然在 stackoverflow 上看到一个比较有意思的问题。关于 J...

    MrZONT 评论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条评论

rubyshen

|高级讲师

TA的文章

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