ECMAScript中所有函数的参数都是按值传递的?

ECMAScript中所有函数的参数都是按值传递的?

前段时间翻《JavaScript高级程序设计》,无意间发现了这样的一段描述:ECMAScript中所有函数的参数都是按值传递的。而作者给出的解释是:

//这里代码并不完全是照搬书上的,所以可能不一致,但是意义是一样的
var people = new Object();
function setName(data){
	data.name = "data";
	data = new Object();
	data.name = "new Object";
	return data;
}
var result = setName(people);
console.log('people.name : ' + people.name);//people.name : data
console.log('result.name : ' + result.name);//result.name : new Object

我在很久前看到这里的时候就偏执的认为是书上写错了,而后就没有去深究了。最近再次看到这里,还是倍感困惑,不过这次不同的是,我下定决心一定要弄清楚。

JavaScript中的变量类型主要有两大类,一种是基础类型(Null、Undefined、Number、Boolean、String、Symbol、BigInt),一种是引用类型(Object)。
JavaScript中对变量存储有两种方式,一种是栈,一种是堆(本篇主要是解答ECMAScript中所有函数的参数都是按值传递的,关于堆栈等知识点不作详述,如果影响不了解此知识点而导致对本文无法进行阅读,建议自行补充此方面知识点)。基础类型的是存在栈里面的,而引用类型的是存在堆里面的,对这个值的引用是存在栈里面的。
如果按照这样理解,所谓的按值传递就是错的,但是真的是错的吗?我们继续往下面看。
作者说所有函数的参数都是按值传递的,我理解的作者在这里想表达的值,是变量的值,而不是存储在堆里面的值

var obj = new Object();
function func(data){
//code
}

就如同这里的代码一样,值,也就是变量的值,指的还是存储在栈中的引用

看到这里,也许有些人会觉得我在玩文字游戏,别急,我将继续展示出证据证明我理解的正确性。

在书上还有这样一句话,有不少开发人员在这一点上可能会感到困惑,因为访问变量有按值和引用两种方式,而参数只能按值传递。其实这里也是对我造成困扰最严重的地方,如果用JavaScript来理解这句话,确实会照成很大的困扰,因为这里的不少开发人员指的根本就不是JavaScript开发人员(或者说使用没有指针的语言的开发人员

//js
var num = 3;
var obj = new Object();

变量num的值是3,变量obj的值是new出来的Object对象存储在堆内存中的地址值,那变量num和变量obj的值的引用是什么呢?

我开始也理解错了这里的含义,直到我看到了这篇博客1下面的一个评论。如果按照c/c++的思想来理解,确实就可以解释的通了。

//c
int num = 3;
int *numAddress;
numAddress = #

变量num的值是3,变量num的值的引用(应该叫指针)是numAddress

JavaScript是没有二级指针的,也就是没有引用的引用,所以所有函数的参数都是按值(相对于变量)传递。

本人才疏学浅,有什么错误,还望不吝赐教。


  1. https://blog.csdn.net/weixin_39728230/article/details/80607294 ↩︎

原创文章 18 获赞 44 访问量 7395

猜你喜欢

转载自blog.csdn.net/qq_35508835/article/details/106041350
今日推荐