深入理解JavaScript 参数按值传递

 更新时间:2017年05月24日 09:24:12   作者:冴羽  
本篇文章主要介绍了深入理解JavaScript 参数按值传递,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

定义
ECMAScript中所有函数的参数都是按值传递的。

什么是按值传递呢?

也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

按值传递

举个简单的例子:

var value = 1;
function foo(v) {
  v = 2;
  console.log(v); //2
}
foo(value);
console.log(value) // 1

很好理解,当传递 value 到函数 foo 中,相当于拷贝了一份 value,假设拷贝的这份叫 _value,函数中修改的都是 _value 的值,而不会影响原来的 value 值。

引用传递

拷贝虽然很好理解,但是当值是一个复杂的数据结构的时候,拷贝就会产生性能上的问题。

所以还有另一种传递方式叫做按引用传递。

所谓按引用传递,就是传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象。

举个例子:

var obj = {
  value: 1
};
function foo(o) {
  o.value = 2;
  console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2

哎,不对啊,连我们的红宝书都说了 ECMAScript 中所有函数的参数都是按值传递的,这怎么能按引用传递成功呢?

而这究竟是不是引用传递呢?

第三种传递方式

不急,让我们再看个例子:

var obj = {
  value: 1
};
function foo(o) {
  o = 2;
  console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1

如果 JavaScript 采用的是引用传递,外层的值也会被修改呐,这怎么又没被改呢?所以真的不是引用传递吗?

这就要讲到其实还有第三种传递方式,叫按共享传递。

而共享传递是指,在传递对象的时候,传递对象的引用的副本。

注意: 按引用传递是传递对象的引用,而按共享传递是传递对象的引用的副本!

所以修改 o.value,可以通过引用找到原值,但是直接修改 o,并不会修改原值。所以第二个和第三个例子其实都是按共享传递。

最后,你可以这样理解:

参数如果是基本类型是按值传递,如果是引用类型按共享传递。

但是因为拷贝副本也是一种值的拷贝,所以在高程中也直接认为是按值传递了。

所以,高程,谁叫你是红宝书嘞!

深入系列

JavaScript深入系列目录地址: https://github.com/mqyqingfeng/Blog

JavaScript深入系列预计写十五篇左右,旨在帮大家捋顺JavaScript底层知识,重点讲解如原型、作用域、执行上下文、变量对象、this、闭包、按值传递、call、apply、bind、new、继承等难点概念。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JavaScript实现定时器循环展示数组

    JavaScript实现定时器循环展示数组

    这篇文章主要为大家详细介绍了JavaScript实现定时器循环展示数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 详解webpack的配置文件entry与output

    详解webpack的配置文件entry与output

    本篇文章主要介绍了webpack的配置文件entry与output,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • js 对象使用的小技巧实例分析

    js 对象使用的小技巧实例分析

    这篇文章主要介绍了js 对象使用的小技巧,结合实例形式分析了JavaScript对象的遍历、查找、事件监听等相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • json字符串之间的相互转换示例代码

    json字符串之间的相互转换示例代码

    这篇文章主要介绍了json 字符串之间的相互转换 ,通过eval()函数可以将JSON字符串转化为对象,本需要的朋友可以参考下
    2014-08-08
  • 微信小程序实现一键回到顶部功能

    微信小程序实现一键回到顶部功能

    这篇文章主要为大家详细介绍了微信小程序实现一键回到顶部功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 7个你应该知道的JS原生错误类型

    7个你应该知道的JS原生错误类型

    这篇文章主要介绍了7个你应该知道的JS原生错误类型,对此感兴趣的同学,可以参考一下
    2021-04-04
  • 利用OpenLayer绘制扇形的示例代码

    利用OpenLayer绘制扇形的示例代码

    这篇文章主要介绍了如何利用OpenLayer实现绘制扇形,文中的示例代码讲解详细,对我们学习OpenLayer有一定的帮助,感兴趣的可以了解一下
    2022-06-06
  • uniapp开发小程序的经验总结

    uniapp开发小程序的经验总结

    这篇文章主要给大家介绍了关于uniapp开发小程序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • JS实现的简单tab切换功能完整示例

    JS实现的简单tab切换功能完整示例

    这篇文章主要介绍了JS实现的简单tab切换功能,结合完整实例形式分析了javascript基于事件响应实现页面元素属性动态变换相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • 解决layui-table单元格设置为百分比在ie8下不能自适应的问题

    解决layui-table单元格设置为百分比在ie8下不能自适应的问题

    今天小编就为大家分享一篇解决layui-table单元格设置为百分比在ie8下不能自适应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09

最新评论