关于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模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...
随机推荐
- C++中将string类型转化为int类型
写程序需要将string转化为int,所以就探索了一下. 方法一:atoi函数 atoi函数将字符串转化为整数,注意需要stdlib库.所以就尝试了一下: #include <iostream& ...
- [UWP]附加属性2:实现一个Canvas
5. 附加属性实践:自定义Canvas 附加属性在UWP中是一个十分重要的组成部分,很多功能都依赖于附加属性实现,典型的例子是常用的Grid和Canvas.通常附加属性有三个使用场景:插入属性.触发行 ...
- 从C#到TypeScript - Generator
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- plugman创建cordova插件
一.安装plumam npm install -g plugman 二.安装完之后,就可以创建plugin plugman create --name --plugin_id --plugin_ver ...
- BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)
这是建空间后做的第一道题啊= =好水 排序,枚举最小边,然后并查集求出联通时的最大边 或者排次序,从小到大插边,如果插边时最小的边拿掉不会使s与t不联通,就删去。 code: #include< ...
- 阿里巴巴Java开发手册评述
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...
- Python之路--你不知道的platform
某次在查看测试机(Ubuntu)发行版本时,发现得到的结果并不准确:本应得到Ubuntu,结果显示的却是Debian,大致代码如下 ... distribution_name = ['centos', ...
- WPF 多语言解决方案 - Multilingual App Toolkit
1.首先安装Multilingual App Toolkit 2.新建项目,在VS中点击"工具" -> "Multilingual App Toolkit&qu ...
- iOS开发-APP测试基本流程
1. UI 测试app主要核ui与实际设计的效果图是否一致:交互方面的问题建议,可以先与产品经理确认,确认通过后,才开始让开发实施更改或优化 2. 功能测试根据软件说明或用户需求验证App的各个功能实 ...
- 项目架构开发:数据访问层之Query
接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操 ...