关于js参数传递矛盾新理解
之前看了很多人的解释,说js中,函数的参数传递都是值传递中不理解。
他们无非举了两个例子


在这两个例子中,第二个例子可以看出参数是由值传递的。因为函数内对象的变化没有影响到函数外对象的变化。但是在第一个例子中,我们却发现,函数内和函数外都指向了一个地址。但是博主并没有说明
既然是值传递,为什么参数里面的改变却影响了外面的值。博主只解释了第二个例子是值传递,却没有解释第一个例子为什么会出现这样的原因,只是一句两个变量指向一个对象
就一笔带过,我觉得这个并没有解决大多数人的理解。所以我觉查看了js高级程序设计的原话。
《js高级程序设计》上是这样叙述参数传递的:所有函数的参数都是按值传递的
这段话摘抄自第四章的第一章节的传递参数。
这里解释一下,值传递。值传递就是传进来的参数中,我们传递的是一个值,而不是一个指针。
其实。为什么第一个例子中,两个变量指向的是一个对象。原因很简单,就是因为这里的参数传递的本来就是一个地址。这似乎和之前说的所有参数都是值传递相违背。觉得既然是值传递应该传递的是一个对象,然后在参数中建立一个这个对象的副本。其实这是一种错误的理解。
这里需要解释一下值传递,什么是值传递。值传递就是说,参数传递的是其中的值,然后这个值在函数中会建立一个副本,在函数内操作参数的其实是这个副本,而不是函数外传递的变量。
而js函数机制中,函数传递的参数,会把参数的值存储在arguments(这个数组是函数对象自带的数组,用来保存参数值)这个数组中,我们操作的参数,其实是这个数组中的值。这里就从本质上解释了js函数是值传递。
了解这个我们就可以说为什么第一个例子中所出现的现象了。因为,对象参数传递的,本身就是一个地址,他并不是一个对象。
这里可能还会疑惑,既然是传递的地址为什么还叫做值传递。
我们可以通过一幅图来理解

在这里,当a被当做参数时,a中的值也就是地址,被传递进了arguments这个数组中,而值传递和引用传递,指的其实对于这个地址来说的。
值传递, 就是传递a的值,a的值其实就是指向Object的地址。
如果是
引用传递,传递的是a的地址,也就是指向a的地址。如果了解c语言就可以对这个明白了。
a中保存的是指向对象的一个指针,在引用传递中,会传递一个指向a的指针。
所以这就解释了为什么会出现两个例子中这个看似很矛盾的的原因了。
值传递还是引用传递,他所说的并不是a指向的对象的传递方式,而仅仅是a的传递方式。
这是自己的理解,我觉得这样的理解对我来说才彻底解释了我之前感觉两个例子的矛盾的原因
关于js参数传递矛盾新理解的更多相关文章
- js参数arguments的理解
原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...
- js赋值运算的理解
简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...
- 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
1.2017前端面试题及答案总结 |掘金技术征文 "金三银四,金九银十",用来形容求职最好的几个月.但是随着行业的饱和,初中级前端er就业形势不容乐观. 行业状态不可控,我们能做的 ...
- Node.js Event Loop 的理解 Timers,process.nextTick()
写这篇文章的目的是将自己对该文章的理解做一个记录,官方文档链接The Node.js Event Loop, Timers, and process.nextTick() 文章内容可能有错误理解的地方 ...
- js原型浅谈理解
之前在学习原型(prototype)的时候,一直对原型的理解不是很清晰,只是知道每个对象都有一个原型,然后在js中万物又皆对象.在这里谈一下自己对于js原型的简单理解吧. 原型可以实现属性和方法的共享 ...
- 对js原型简单的理解和图解
对js原型简单的理解和图解 最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下. 1.prototype prototype:是一个函数的 ...
- js回调函数的理解
js回调函数(callback)理解 Mark! 讲之前说一句 function say(){ alert(,,,,,,,,) } var say=function (){ alert(,,,,,,, ...
- Js模块化开发的理解
Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...
随机推荐
- JavaScript嗅探执行神器-sniffer.js,你值得拥有!
一.热身--先看实战代码 a.js 文件 // 定义Wall及内部方法 ;(function(window, FUNC, undefined){ var name = 'wall'; Wall.say ...
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...
- Dynamics CRM 2015-Form之添加Ribbon Button
说到在CRM Form上添加Ribbon Button,那就不得不提到一个Tool:Ribbon Workbench,使用这个Tool,能为我们添加button带来不少便利. Ribbon Workb ...
- js-组件-轮播
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Java三大修饰符
1.static 修饰: 修饰属性:类变量,全类共有 修饰方法:静态方法,静态方法中不能直接访问非静态的方法和属性 静态方法只能被静态方法覆盖,并且没有多态 静态的方法或者属性不依赖于对象:类名.方法 ...
- git 命令用法 流程操作
Git 是一款免费的.开源的.分布式的版本控制系统.旨在快速高效地处理无论规模大小的任何软件工程. 每一个 Git克隆 都是一个完整的文件库,含有全部历史记录和修订追踪能力,不依赖于网络连接或中心服务 ...
- Android 调用jepg库进行图片压缩,保持图片不失真
1. 浅谈为什么Android和iOS图片质量差距那么大? 首先来说,作为一个安卓狗,机器当然用的是安卓的手机.现在的安卓手机大多数都会以高清拍照,动不动就几千万柔光相机来吸引各种买家.买来后,拍照发 ...
- 从C#到TypeScript - Reflect
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)
Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...
- 每天一个Linux命令(23)--linux 目录结构(一)
对于每一个Linux 学习者来说,了解 Linux 文件系统的目录结构,是学好Linux 的至关重要的一步,深入了解Linux 文件目录结构的标准和每个目录的详细功能,对于我们用好Linux 系统至关 ...