需要明白,js基本类型存放在栈,对象存放在堆。

结论:基本类型变量作为参数,不会改变变量值。对象变量作为参数,不修改属性(访问原始对象的操作),也不会改变变量值

起因,是群里一个问题:

var a = [1,2,3];
function f(a){
a = [4,2,3];
}
f(a);
a // [1, 2, 3] //数组内部的值没有发生改变 var a = [1,2,3];
function f(a){
a[0]=4;
}
f(a);
a // [4,2,3]
最后数组a的值发生了改变

参阅了两篇文章。

这篇另一篇,心有所得,记录之。

参数为基本类型时,

var x=1,y="dss";
function f(a,b){
a=2;
b="ww";
}
f(x,y);
x + " and " + y ;// "1 and dss"

不会变化,因为传入参数的是一个值,”按照JS的官方解释就是在基本类型参数传递的时候,做了一件复制栈帧的拷贝动作,这样外部声明的变量num和函数参数的num,拥有完全

相同的值,但拥有完全不同的参数地址,他们在内存中处于不同的位置“,因此改变a,b两个参数的值不会对原值起作用。那像开头的例子那样给基本类型变量改变属性呢?

var x=1,y="dss";
function f(a,b){
a.u=2;
b.s="ww";
}
f(x,y);
x.u+" and "+y.s;//"undefined and undefined"

不会有任何变化,这里还牵扯到包装对象的知识点。但是不慌,记住,基本变量作为参数传值时,不会改变其原始值。(不作为参数当然可以了,访问全局变量赋值太常见了。)

那么参数为对象时,就像上面那样。原因何在呢。

参数传递可以视为引用传递,在函数里,参数a复制了全局变量a,代表[1,2,3]在内存中的地址(姑且这样理解),给参数a赋值,当然对原始对象不会有什么影响。而且对全局变量a

也没有影响,应该说,参数始终只是复制一个栈堆。

下面有很好的两个例子:

function setName(obj){
obj.name="ted";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//输出ted
function setName(obj){
obj.name="ted";
obj=new Object();
obj.name="marry";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//输出ted

第一个里面,通过参数的引用,将原始对象的name属性修改了。而在第二个里面,因为new Object,那个obj已经是一个新的对象了。与name为ted的原始对象无关。所以没有改变。

感觉说的不清楚。

js参数传递分析的更多相关文章

  1. JS 数据类型分析及字符串的方法

    1.js数据类型分析 (1)基础类型:string.number.boolean.null.undefined (2)引用类型:object-->json.array... 2.点运算  xxx ...

  2. 高德JS依赖分析工程及关键原理

    一.背景 高德 App 进行 Bundle 化后,由于业务的复杂性,Bundle 的数量非常多.而这带来了一个新的问题——Bundle 之间的依赖关系错综复杂,需要进行管控,使 Bundle 之间的依 ...

  3. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  4. easyloader.js源代码分析

    http://www.cnblogs.com/jasonoiu/p/easyloader_source_code_analysis.html Jquery easyui是一个javascript UI ...

  5. 关于js参数传递矛盾新理解

    之前看了很多人的解释,说js中,函数的参数传递都是值传递中不理解. 他们无非举了两个例子 在这两个例子中,第二个例子可以看出参数是由值传递的.因为函数内对象的变化没有影响到函数外对象的变化.但是在第一 ...

  6. JS进阶 ] 分析JS中的异步操作

    写在前面 JS因为是单线程的,所以在执行事务的时候,往往会因为某个事务的延迟,而导致服务器假死,这时候异步编程就显的格外重要,但是异步编程一般理解为回调函数callback,典型的就是node,回调函 ...

  7. Node.js性能分析神器Easy-Monitor

    摘要: 使用Easy-Monitor,可以准确定位Node.js应用的性能瓶颈,帮助我们优化代码性能. 当应用出现性能问题时,最大的问题在于:如何准确定位造成性能瓶颈的代码呢?对于Node.js开发者 ...

  8. 记换换回收一个js逆向分析

    随着现在对数据的重视程度越来越高,现在各大网站都加强了反爬技术,比如本文中js加密 url地址:https://www.huanhuanhuishou.com/gujia/22201.html 需要爬 ...

  9. js 参数传递

    最近在读<javascript高级程序设计>时碰到了js传递方式的问题,花费了些时间,不过总算明白了. 数据类型 在 javascript 中数据类型可以分为两类: 基本类型值 primi ...

随机推荐

  1. ThinkPHP 3.2.3(一)基础

    一.安装 ThinkPHP无需任何安装,直接拷贝到你的电脑或者服务器的WEB运行目录下面即可. 如:我使用的是XAMPP集成环境,将框架解压缩到htdocs目录下即可.   二.目录结构 1.初始目录 ...

  2. Web APP开发技巧总结(转)

    一.META/LINK相关: 1.百度禁止转码 通过百度手机打开网页时,百度可能会对你的网页进行转码,往你页面贴上它的广告,非常之恶心.不过我们可以通过这个meta标签来禁止它: <meta h ...

  3. [MISSAJJ原创]cell内 通过SDWebImage自定义创建动态菊花加载指示器

    最后更新已经放到了github上了 MISSAJJ自己写的一个基于SDWebImage自定义的管理网络图片加载的工具类(普通图片加载,渐现Alpha图片加载,菊花Indicator动画加载) 经常在项 ...

  4. Sql Server Alter语句

    1:向表中添加字段 Alter table [表名] add [列名] 类型 2:  删除字段 Alter table [表名]  drop column [列名] 3:  修改表中字段类型 (可以修 ...

  5. Spark机器学习示例

    1. Java代码 /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor lice ...

  6. jquery 巧用json传参

    JavaScript代码,巧用JSON传参数function AddComment(content) { var comment = {}; comment.threadId = $("#s ...

  7. #define DELAY_ONE_MICROSECOND (-10) 时间是负数的原因

    以下摘自DOOM的博文<内核同步对象> http://blog.csdn.net/lqk1985/article/details/2541867 “最后一个参数&timeout是一 ...

  8. 根据序列图像聚焦区域获取深度 Shape From Focus

    最为超新新新新鸟...我也不知道第一篇文章应该写什么..所以,把自己最近正在研究的东西报一下吧, 研究的东西其实也不算深奥,就是对一个图像序列中的每张图像进行检测,发现每张图片的聚焦清晰区域,找到这个 ...

  9. win8.1安装Matlab7.0的兼容问题

     Matlab7.0安装完成后打开就立即关闭,此时右键点击MATLAB7.0快捷方式-"用图形处理器运行"-"更改默认图形处理器",将"集成图形&qu ...

  10. PDA项目介绍

    开发工具:Microsoft Visual Studio 2008 SDK:      Windows Mobile 6 SDK 数据库:     Oracle 开发语言:C#(3.5) 版本控制工具 ...