菜单

JavaScript 深入之参数按值传递

2018年11月15日 - 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 值。

仍值传递

选个大概的事例manbetx2.0手机版:

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 赞 收藏
    评论

manbetx2.0手机版 1

生一样篇稿子

JavaScript深入的call和apply的模仿实现

深切系列

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

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

倘有误或不小心的地方,请务必与指正,十分感谢。如果爱还是有所启发,欢迎star,对作者吧是一致种植鞭策。

相关文章

发表评论

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

网站地图xml地图