需要明白,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. html/css小练习2

    效果图:

  2. discuz手机版模板开发

    1.触屏版模板手机路径 discuz X3触屏版模板路径:/template/default/touch/forum/discuz.htm(主页面模板) discuz X3标准版模板路径:/templ ...

  3. Windows Store App JavaScript 开发:文件选取器

    正如前面章节C#语言中所介绍的,文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应用中直接与文件系统进行交互,访问不同位置的文件或文件夹,或者将文件存储在指定位置.文件选取器分为对文件进 ...

  4. JavaScript 面向对象(一) —— 基础篇

    学好JS的面向对象,能很大程度上提高代码的重用率,像jQuery,easyui等,这篇博客主要从细节上一步步讲JS中如何有效地创建对象,也可以看到常见的创建对象的方式,最后也会附上一些JS面向对象的案 ...

  5. 一个比较通用的makefile

    .PHONY : all clean DEBUG := YES CC := gcc CXX := g++ LD := g++ AR := ar rc HOME_PATH := $(realpath . ...

  6. bzoj 3504: [Cqoi2014]危桥

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  7. 利用Cayley-Hamilton theorem 优化矩阵线性递推

    平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...

  8. Android源码编译出错解决办法

    编译环境:Ubuntu12.04 64位 Android源码:Android 4.3 以下问题是笔者亲自碰到,通过网上查询整合在一起的. 1.error while loading shared li ...

  9. 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,

    在用sudo apt-get install kmymoney2安装软件kmymoney2时,由于速度太慢,想换个软件源,直接关闭了终端,apt-get但进程没有结束,结果终端提示:“E: 无法获得锁 ...

  10. HttpRequestUtil

    package com.didichuxing.tempdirreader; import com.alibaba.fastjson.JSONObject; import java.io.Unsupp ...