JS有哪几种传参方式?

大家好,我是IT修真院武汉分院web第17期的学员吴三水,一枚正直纯洁善良的web程序员。
今天给大家分享一下,修真院官网js(职业)任务四,深度思考中的知识点——JS有哪几种传参方式?

1.背景介绍

什么是传参

我今天要讲的是js基础传参:值传递、对象传递

概念

在计算机科学里,按值传递(call by value)和按引用传递(call by reference)这个部分统称求值策略(Evaluation Strategy)。它决定变量之间、函数调用时实参和形参之间值是如何传递的。

2.知识剖析

按值传递参数(最常用的求值策略)

函数的形参是被调用时所传实参的副本。
在函数中调用的参数是函数的参数。
如果函数修改参数的值,将不会修改参数的初始值(在函数外定义)。
函数参数的改变不会影响函数外部的变量(局部变量)。

通过对象传递参数

函数的形参接收实参的隐式引用,而不再是副本。
因此我们在函数内部修改对象的属性就会修改其初始的值。
修改对象属性可作用于函数外部(全局变量)。

缺点:

按引用传递会使函数调用的追踪更加困难,有时也会引起一些微妙的BUG。
按值传递由于每次都需要克隆副本,对一些复杂类型,性能较低。两种传值方式都有各自的问题。

3.常见问题

javascript是按值传递,还是按引用传递来传递参数?

4.解决方案

先看一串代码


function changeStuff(num, obj1, obj2)
{
    num = num * 10;
    obj1.item = "changed";
    obj2 = {item: "changed"};
}
 
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);   // 10
console.log(obj1.item);    // changed
console.log(obj2.item);    // unchanged

传值

函数内的num, obj1, obj2都将是一份新的内存,与调用函数之前定义的三个变量毫无关系。函数内无论怎么修改这三个参数,外部定义的三个变量的值始终不变

传引用

函数内的num, obj1, obj2都分别指向一块内存,该内存就是调用函数之前定义的三个变量时创建的内存。函数内对这三个参数所做的任何改动,都将反映到外部定义的三个变量上。

总结

从上面的代码可以看出,JavaScript中函数参数的传递方式既不是传值,也不是传引用,而是叫call-by-sharing。

5.编码实战

6.扩展思考

什么是按共享传递 call by sharing?

JS中的基本类型按值传递,对象类型按共享传递的(call by sharing,也叫按对象传递、按对象共享传递)。最早由Barbara Liskov. 在1974年的GLU语言中提出。该求值策略被用于Python、Java、Ruby、JS等多种语言。

该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。
如下面例子,不可以通过修改形参o的值,来修改obj的值。

var obj = {x : 1};
function foo(o) {
    o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.

不过,虽然引用是副本,但是引用的对象是相同的。它们共享相同的对象,所以修改形参对象的属性值,也会影响到实参的属性值。
如下面列子,通过修改形参对象o.x的值,来修改obj的值

var obj = {x : 1};
function foo(o) {
    o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!

7.参考文献
js基础之传参
8.更多讨论
js还有其他传参方式吗?
答:函数之间的传参是没有了,不过js页面之间也有对应的传参方法。
js页面有几种传参方式?
答:一、URL;二、H5 web storage;三、Cookie;四、Form 表单.
它们各有什么优点?
答:URL传参:取值方便,可以跨域;H5 Web storage:使用起来非常简单、方便;Cookie传参:兼容性最好,可以在同源内的任意网页内访问,生命期可以设置。
感谢大家观看!
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值