【javascript基础——系列8】函数传参传递的是值还是引用;函数式编程

系列文章

【javascript基础——系列1】前端页面ajax连接后台服务器传输数据

【javascript基础——系列2】前端页面axios连接后台服务器传输数据

【javascript基础——系列3】js中的事件的事件冒泡、事件捕获

【javascript基础——系列4】关于js的数据类型以及判别方法

【javascript基础——系列5】js的defer和async;parsesint;图片压缩

【javascript基础——系列6】常见的5种JS设计模式;发布订阅者模式

【javascript基础——系列7】变量提升函数提升;内存泄漏

【javascript基础——系列8】函数传参传递值还是引用;函数式编程

【javascript基础——系列9】函数防抖与节流

【javascript基础——系列10】js中隐藏元素的几种方法以及代码

【javascript基础——系列11】跨域存在的原因以及解决办法



一、函数传参传递的是值还是引用

var testA=1;
var testB={};
function testNumber(example){
    example=2;
}
 
function testObj(example) {
    example.test=1;
}
 
testNumber(testA);
testObj(testB);
console.log(testA);//输出1
console.log(testB);//输出{test:1}

1.1 按值传递

按值传递是在内存传递中直接把实参的值复制一份再把副本传递给形参,对于形参的修改不会影响到实参。

1.2 按引用传递

函数使用按引用传参,形参将会直接接收实参的引用,而不经过复制,那么此时对于形参的修改则会影响到实参。

1.3 js中的传参策略

  • 在js中不管是值类型还是引用类型都是按值传递的,对于值类型,传参发生时,复制的是类型本身的值,而对于引用类型,复制的是类型的地址。
  • 对于js中的变量,值类型存放在栈中,引用类型的地址存放在栈中,对于的值放在堆中,值类型会直接将栈中的值进行复制,形参和实参此时是毫不相干的变量。对于引用类型,传参发生时,会将实参变量位于栈中的地址进行复制,此时栈中会有两个指向同一个堆地址的指针。

在这里插入图片描述
不同地址情况:

var testB={};
var testC={};
function testObject(example){
    example={b:1};
}
 
function testObj(example) {
    example.test=1;
}
 
 
testObject(testC);
testObj(testB);
console.log(testC);//输出{}
console.log(testB);//输出{test:1}

事实上,由于对引用对象的地址复制,形参和实参之间还是存在关联的,地址指向了同一个对象,也就是说我们调用testObj操作形参时,对应操作的对象也是实参。但是调用testObject时,就是另一种状况了,当我们直接将形参替换成另一个值,在内存中会形成下图的情况

在这里插入图片描述


二、函数式编程

2.1 函数式编程是什么

它是一种编程范式,利用函数把运算过程封装起来,通过组合各种函数来计算结果。比如把字符串每个单词首字母大写:整个过程就可以用 join(map(split(str))),split把字符串转换为数组,map把各个元素首字母变成大写,join把数组转换为字符串。

2.2 函数式编程基本特点

  • 通过函数堆数据进行转换
  • 通过串连多个函数来求结果

2.3 对比声明和命令式

命令式:通过编写一条条指令让计算机执行一些动作,频繁使用语句来完成某个行为,如for、if、switch、throw。
声明式:通过写表达式声明目的:表达式通常是某些函数调用的复合、一些值和操作符。

//命令式	
var CEOs = [];	
for(var i = 0; i < companies.length; i++){	
    CEOs.push(companies[i].CEO)	
}	
//声明式	
var CEOs = companies.map(c => c.CEO);

2.4 函数式编程的特性

  1. 无副作用:

指调用函数不会修改外部状态,一个函数调用多次依旧返回同样的结果

  1. 透明引用:

一个函数只会用到传递给它的变量以及内部创建的变量不会用其他的变量

  1. 不可变变量:

一个变量一旦创建之后,不会被改变,任何修改都会生成一个新的变量。使用不可变变量最大的好处就是线程安全。多个线程可以同时访问一个不可变变量,让并行变得更加容易实现。但是js原生不接受不可变变量,因此需要第三方来实现。

  1. 函数是一等公民:

指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数或者作为别的函数的返回值。闭包、高阶函数、函数柯里化和函数组合都是围绕这一特性的应用。


码字不易~, 各位看官要是看爽了,可不可以三连走一波,点赞皆有好运!,不点赞也有哈哈哈~~~

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让子弹飞一会儿=>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值