菜单

JavaScript深入的参数按值传递

2018年11月16日 - JavaScript

JavaScript 深入的参数按值传递

2017/05/23 · JavaScript
· 参数

初稿出处: 冴羽   

JavaScript深入系列第九篇,除了按值传递、引用传递,还有第三种植传递方式
—— 按共享传递

定义

每当《JavaScript高级程序设计》第三本子 4.1.3,讲到传递参数:

ECMAScript中保有函数的参数还是遵循值传递的。

嘿是仍值传递呢?

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

定义

在《JavaScript高级程序设计》第三版本 4.1.3,讲到传递参数:

ECMAScript中存有函数的参数都是按照值传递的。

哟是遵照值传递呢?

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

按值传递

选个简易的例证:

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

1
2
3
4
5
6
7
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 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

1
2
3
4
5
6
7
8
9
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.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

1
2
3
4
5
6
7
8
9
var obj = {
    value: 1
};
function foo(o) {
    o = 2;
    console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1

如 JavaScript
采用的凡引用传递,外层的价为会吃修改呐,这怎么又尚未为反呢?所以真不是援引传递吗?

即时虽假设出口到实在还有第三种传递方式,叫按共享传递。

只要共享传递是指,在传递对象的时段,传递对象的援的副本。

顾:
按引用传递是传递对象的援,而按照共享传递是传递对象的援的副本!

据此修改 o.value,可以经过引用找到原值,但是一直改动
o,并无见面窜原值。所以亚个及老三个例其实还是遵循共享传递。

末了,你可如此敞亮:

参数如果是主导项目是依值传递,如果是援类型按共享传递。

唯独因拷贝副本也是千篇一律栽价值的正片,所以在海拔中吗一直当是按部就班值传递了。

于是,高程,谁叫您是红宝书嘞!

老三种传递方式

匪心急,让咱们再次拘留个例:

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、继承等难点概念。

苟起不当或无谨言慎行的地方,请务必与指正,十分感谢。如果喜欢或者持有启发,欢迎star,对笔者为是如出一辙栽鞭策。

本系列:

  1. JavaScirpt 深入之从原型到原型链
  2. JavaScript
    深入的词法作用域和动态作用域
  3. JavaScript 深入之履上下文栈
  4. JavaScript 深入之变量对象
  5. JavaScript 深入的图域链
  6. JavaScript 深入之从 ECMAScript 规范解读
    this
  7. JavaScript 深入的实践上下文
  8. JavaScript 深入之闭包

    1 赞 收藏
    评论

图片 1

产同样首文章

JavaScript深入之call和apply的效仿实现

深刻系列

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

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

倘出错或无严谨的地方,请务必与指正,十分感谢。如果爱或者具有启发,欢迎star,对作者为是一模一样栽鞭策。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图