【JS】JavaScript中的参数传递
ECMAScript中所有函数的参数都是按值传递的,简单讲就是函数外部的值 复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。切记访问变量有按值访问和按引用访问,而参数只能按值传递。
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(可以把ECMAScript函数中的参数想象成局部变量);向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量。
实例1:
// 参数是基本类型的值
function add(n){
n += 1;
return n;
} var num = 2;
var result = add(num);
alert(num); // 2
alert(result); // 3
在函数内,参数n的值被加上1,但这并不会影响函数外的num变量,参数n与变量num仅仅是具有相同值,但互不相识。如果是按引用传递,则变量num的值将变为3.
实例2:
// 参数是对象
function setName(obj){
obj.name = "123";
} var p = new Object();
setName(p);
alert(p.name); // "123"
这里创建了一个对象,并保存在变量p中,当这个对象被传递到setName()函数中之后就被复制给了obj。在函数内,obj和p引用的是同一个对象。也可以说即使这个对象是按值传递的,obj也会按引用来访问同一个对象。所以在函数内为obj添加name属性后,函数外的p会反映出来,这里p指向的对象在堆内存中只有一个,并且是全局对象。
很多错误地认为在局部作用域中修改的对象会在全局作用域中反映出来,就说明是按引用传递。为了证明上面例子是按值传递,再看下面的实例3:
function setName(obj){
obj.name = "123";
obj = new Object(); // obj的值变为堆内存中一个新的地址,但o变量的值并不受影响
obj.name = "321";
} var p = new Object();
setName(p);
alert(p.name); // "123"
这里与实例2中不同的是给obj重新定义了一个对象,并重新定义了name属性。如果p是按引用传递的,那么p就会自动被修改为指向name属性值为“321”的新对象,但实际访问p.name时,值仍是“123”。这就说明虽然在函数内修改了参数的值,但原始变量的引用不会受影响,保持不变。其实当参数是对象时,按值传递时传递的就是对象在堆内存中的地址 另:当在函数内部重写obj时,这个变量引用的就是一个局部对象了,而这个局部对象在函数执行完后立即被销毁。
在Java中也类似,以下是简单的实例:
public class Demo14 {
public static void main(String[] args) throws Exception{
int num = 2;
int result = add(num);
System.out.println(num); // 2
System.out.println(result); // 3 Obj o = new Obj();
setObjName(o);
System.out.println(o.getName()); // 123 } public static int add(int n){
n += 1;
return n;
} public static void setObjName(Obj obj){
obj.setName("123"); obj = new Obj(); // obj的值变为堆内存中一个新的地址,但o变量的值并不受影响
obj.setName("321");
} } class Obj{
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
【JS】JavaScript中的参数传递的更多相关文章
- 理解JavaScript中的参数传递 - leetcode189. Rotate Array
1.关于leetcode 这是第一篇关于leetcode的题解,就先扯点关于leetcode的话. 其实很早前就在博客园看到过leetcode一些题解,总以为跟一般OJ大同小异,直到最近点开了一篇博文 ...
- [js]javascript中4种异步
javascript中4种异步: 1.ajax 2.定时器 3.事件绑定 4,回调 定时器 //顺序执行 /* var s = 0; for (var i = 0; i < 10000; i++ ...
- js | javascript中获取dom元素的高度和宽度
javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...
- Javascript 基础知识学习--javascript中的参数传递都是按值传递的
ECMAScript中所有函数的参数传递都是按值传递的,无论参数是值类型还是引用类型的.过去我跟大多数人一样觉得跟传值类型相关. 自己写了一个测试的例子,确实如此 function add(a) { ...
- JS JavaScript中的this
this是JavaScript语言中的一个关键字 它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用. function test() { this.x = 1; } 上面代码中,函 ...
- js | JavaScript中数据类型转换总结
转载 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = “123”; a = Number(a); ...
- JS JavaScript中的文档碎片 DocumentFragement JS性能优化
文档碎片是什么: 如果我们要在一个ul中添加100个li,如果不使用文档碎片,那么我们就需要使用append经常100次的追加,这会导致浏览器一直不停的渲染,是非常消耗资源的.但是如果我们使用文档碎片 ...
- JavaScript中解析JSON --- json.js 、 json2.js 以及 json3.js的使用区别
JSON官方(http://www.json.org/)提供了一个json.js,json.js是JSON官方提供的在JavaScript中解析JSON的js包,json.js.json2.js.js ...
- javascript中外部js文件取得自身完整路径得办法
原文:javascript中外部js文件取得自身完整路径得办法 有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也 ...
随机推荐
- DELPHI判断是否64位操作系统
function IsWin64: Boolean;var Kernel32Handle: THandle; IsWow64Process: function(Handle: Windows.TH ...
- thinkPHP 模板中的语法
一.导入CSS和JS文件 1.css link js scr <link rel='stylesheet' type='text/css' href='__PUB ...
- js模块化开发——require.js的实战写法1
关于在Require.js使用一个JS插件的问题 我需要在项目中引用一个js控件,这个控件依赖于a.js,b.js,c.js,.....n.js N多个js以及jquery及jquery-ui,各js ...
- java实现算术表达式求值
需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...
- 新版本chrome浏览器控制台怎么设置成独立的窗口
新版本chrome浏览器控制台怎么设置成独立的窗口: 就是你要切换控制台在底部和右侧的那个按钮,然后长按
- js动画(四)
终于到了最后了,这里要告一段落了,整了个js运动框架,咳咳咳,好冷 啊啊啊啊啊啊,这天气.妈的,工资怎么也不发,啊,说好的 人与人之间的信任呢?哎,气诶,不到150字啊,又是这个梗..怎么办?说些什么 ...
- 转:C# Process.Start()方法详解
http://blog.csdn.net/czw2010/article/details/7896264 System.Diagnostics.Process.Start(); 能做什么呢?它主要有以 ...
- [转载] A successful Git branching model/GIT分支管理是一门艺术
转载自:http://www.cnblogs.com/baiyw/p/3303125.html 英文原文:http://www.nvie.com/posts/a-successful-git-bran ...
- Ceph QoS 初探(下)
作者:吴香伟 发表于 2017/01/24 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 存储QoS是个可以做很大也可以做很小的特性.SolidFire认为将Q ...
- 关于sleep()和interrupt()及主线程和线程
看代码 public class TestSleep { public static void main(String args[]) throws InterruptedException{ Thr ...