深入浅析JS是按值传递还是按引用传递(推荐)

 更新时间:2016年09月18日 13:12:01   作者:ngulc  
这篇文章主要介绍了JS是按值传递还是按引用传递(推荐)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

  按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

  按引用传递会使函数调用的追踪更加困难,有时也会引起一些微妙的BUG。

  按值传递由于每次都需要克隆副本,对一些复杂类型,性能较低。两种传值方式都有各自的问题。

  JS的基本类型,是按值传递的。

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为1, 未受x = 2赋值所影响

  再来看看对象的传递:

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

  可以看出,对象的值得传递并不是按引用传递。其实,按共享传递 call by sharing,准确的说,JS中的基本类型按值传递,对象类型按共享传递的(call by sharing,也叫按对象传递、按对象共享传递)。

  该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。

  总之,基本类型是按值传递,而对于对象来说传入的是对象指向的地址,也可以认为其是特殊的按值传递。如果在函数内对对象的属性进行操作,实际就是对其指向对象的属性进行操作。但是,如果对其整体进行操作(比如:o = 100或者o = []),其实际是新定于了对象,实参的引用地址为新的对象的引用地址,与原来的引用没有任何关系,所以不会对原来的对象造成改变。

以上所述是小编给大家介绍的JS是按值传递还是按引用传递(推荐)的全部知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 基于js + html2canvas实现网页放大镜功能

    基于js + html2canvas实现网页放大镜功能

    最近接到任务,需实现【网页】放大镜的效果,百度搜索 【js 放大镜】关键字,千篇一律的都是一些仿淘宝/京东等电商网站中查看规格大图的效果实现,根本无法满足我的需求,于是自己花了点时间调研实现,在这里分享给大家,感兴趣的朋友可以参考下
    2023-12-12
  • 基于javascript 显式转换与隐式转换(详解)

    基于javascript 显式转换与隐式转换(详解)

    下面小编就为大家分享一篇基于javascript 显式转换与隐式转换(详解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • JS验证字符串功能

    JS验证字符串功能

    这篇文章主要介绍了JS验证字符串功能实例代码,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • 跟我学习javascript的浮点数精度

    跟我学习javascript的浮点数精度

    跟我学习javascript的浮点数精度,带大家真正的理解JavaScript的浮点数,提醒大家当心浮点运算中的精度陷阱,需要的朋友可以参考下
    2015-11-11
  • 如何从对象数组中筛选符合条件的值

    如何从对象数组中筛选符合条件的值

    这篇文章主要介绍了如何从对象数组中筛选符合条件的值,具有很好的参考价值,希望对大家有所帮助。
    2022-09-09
  • 使用electron制作满屏心特效的示例代码

    使用electron制作满屏心特效的示例代码

    这篇文章主要介绍了使用electron制作满屏心特效的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • JS实现Fisheye效果动感放大菜单代码

    JS实现Fisheye效果动感放大菜单代码

    这篇文章主要介绍了JS实现Fisheye效果动感放大菜单代码,涉及JavaScript事假监听机制及定时函数等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • javascript闭包概念简单解析(推荐)

    javascript闭包概念简单解析(推荐)

    下面小编就为大家带来一篇javascript闭包概念简单解析(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • JavaScript基础之静态方法和实例方法分析

    JavaScript基础之静态方法和实例方法分析

    这篇文章主要介绍了JavaScript基础之静态方法和实例方法,简单分析了javascript静态方法及实例方法的定义、使用相关操作技巧与注意事项,需要的朋友可以参考下
    2018-12-12
  • vscode工具函数idGenerator使用深度解析

    vscode工具函数idGenerator使用深度解析

    这篇文章主要为大家介绍了vscode工具函数idGenerator使用深度解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论