浅谈JavaScript 函数参数传递到底是值传递还是引用
SEO优化长沙网络推广JavaScript函数参数传递的奥秘:值传递还是引用传递?
一直以来,关于JavaScript函数参数传递是值传递还是引用传递的问题,一直困扰着许多开发者。今天,长沙网络推广为大家带来一篇深入浅出的,让我们一起揭开这个谜团。
我们来看一个关于基本类型传递的简单例子:
```javascript
function add(num){
num += 10;
return num;
}
var num = 10;
alert(add(num)); // 输出20
alert(num); // 输出10
```
在这个例子中,按照JavaScript的官方解释,对于基本类型参数传递,函数会创建一个新的栈帧来存储参数值。这意味着函数内部的参数和函数外部的变量拥有相同的值,但占据不同的内存地址。改变函数内部的参数值并不会影响函数外部的变量。上述代码的输出为20和10。
接下来,我们来看一个关于对象引用类型传递的例子:
```javascript
function setName(obj){
obj.name = "ted";
}
var obj = new Object();
setName(obj);
alert(obj.name); // 输出ted
```
在这个例子中,创建了一个对象并将其引用赋给变量obj。在传递函数参数时,同样会创建一个新的栈帧来存储参数值(这里可以理解为对象的引用)。在函数内部,通过修改对象的属性来更改对象的状态。由于函数参数和函数外部变量共享同一个对象的引用,所以函数内部的更改会影响到函数外部的变量。上述代码的输出为“ted”。
那么,有些朋友可能会问,这也可以理解为引用传递呀?其实不是的。在这里,我们严格区分了指针和引用。在类似Java的语言中,已经没有指针的概念。上述过程实际上是一种从符号引用到直接引用的过程。在Java中,引用本身也是一种对象,具有自己的属性和方法。我们无法直接访问和控制引用本身,只能通过引用访问其指向的对象。这种机制避免了内存泄露,被称为内存结构化访问机制。
为了进一步证明上述观点,我们可以稍微改造一下之前的例子:
```javascript
function setName(obj){
obj.name = "ted";
obj = new Object(); // 创建新对象并赋值给函数参数obj
obj.name = "marry"; // 新对象的属性修改不会影响外部变量obj的状态
}
var obj = new Object(); // 外部变量obj的状态不会被改变
setName(obj); // 函数参数obj和外部变量obj指向不同的对象实例
alert(obj.name); // 输出仍然是"ted",因为外部变量obj的状态未被改变。
```
这个例子中的函数参数obj和原有的外部变量obj指向的是不同的对象实例。函数内部的更改不会影响到函数外部的变量。这也进一步证明了JavaScript中的参数传递是值传递而非引用传递。希望这篇文章能帮助大家更好地理解JavaScript的函数参数传递机制。感谢大家的支持!如果您有任何疑问或建议,请随时联系狼蚁SEO团队。请允许我使用Cambrian的代码渲染工具结束这篇文章。感谢您的阅读!
编程语言
- 浅谈JavaScript 函数参数传递到底是值传递还是引用
- 基于Vue的SPA动态修改页面title的方法(推荐)
- 基于jQuery和CSS3制作响应式水平时间轴附源码下载
- CKEditor网页编辑器 中文使用说明
- PHP Cookie的使用教程详解
- ASP.NET Eval 求值运算的一些用法
- jQuery子选择器与可见性选择器实例分析
- 使用vue打包时vendor文件过大或者是app.js文件很大
- 简单谈谈Javascript函数中的arguments
- FLEX 事件机制-自定义事件介绍
- git中submodule子模块的添加、使用和删除的示例代
- Yii2增删改查之查询 where参数详细介绍
- js实现返回顶部效果
- PHP面向对象程序设计内置标准类,普通数据类型
- PHP随机获取未被微信屏蔽的域名(微信域名检测
- php实现的任意进制互转类分享