javacript 参数传递
来源:互联网 发布:上海数据交易中心面试 编辑:程序博客网 时间:2024/05/29 23:43
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 = []),其实际是新定于了对象,实参的引用地址为新的对象的引用地址,与原来的引用没有任何关系,所以不会对原来的对象造成改变。
阅读全文
0 0
- javacript 参数传递
- javacript onclick事件中传递对象参数
- javacript
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- 参数传递
- 参数传递
- 参数传递
- 参数传递
- *参数传递*
- 参数传递
- 参数传递
- 设计模式
- 关于Fortran
- 数据结构与算法分析-3.1
- 指纹验证错误码
- 线性代数书籍推荐
- javacript 参数传递
- java提高篇(46)--反射详解
- hello world
- 狒解AI:百度云ABC一体机是个什么gui?
- 蓝桥杯基础练习 特殊回文数
- 狒话多:AI是存储的救世主吗?
- 狒话:Xeon+FPGA 何去何从?
- 狒料:133…腾讯云定制版Skylake CPU
- 至强SP简析:FPGA及Fabric版本揭密