Java中的变量传递机制以及JS中的参数传递机制
JAVA:
传递基本类型是 就是基本的值传递 不会影响值本身。
package com.wuqi.p1;
public class ValuePassTest {
public static void main(String[] args) {
int a = 1;
//传递基本数据类型,因为是将a的值传递给param,所以即便在pass函数中改变了
//参数的值,a的值还是不会变。所以我们认为在传递基本数据类型的时候是值传递
pass(a);
System.out.println("a= " + a); //1 不改变
}
private static void pass(int param) {
param = 2;
System.out.println("param= " + param);//2
}
}
传递引用类型String时:
public class Hello {
public static void changeInt(String str){
if (str == "blue") {
str = "red";
} else{
str = "green";
}
System.out.println(str);
}
public static void main(String[] args) {
String str = "blue";
changeInt(str);//red
System.out.println(str);//blue
}
}
可以看出str值在方法里为red,已经被修改。但是在main中依旧是没变 这说明方法里的str只是main中的一个复制或者副本。在change里面对str修改后本质上是改变了str的指针指向,指向了一个新的内存地址 ,但main中的str指向并未发生不改变
package com.wuqi.p1;
import com.wuqi.p2.User;
public class PassTest2 {
public static void main(String[] args) {
User user = new User();
user.setName("wutianqi");
//传递对象,因为是将指向User的引用user传递给了param,
//在函数中param.setName会反应到真实的对象中去。
pass(user);
System.out.println("my name is " + user.getName());
}
private static void pass(User param) {
param.setName("wuqi");
System.out.println("my name is " + param.getName());
}
}

然而上图传递对象后 name却发生了变化 原因在此: 传递对象,因为是将指向User的引用user传递给了param,在函数中param.setName会反应到真实的对象中去
对于对象来说传递的是引用的一个副本给参数,这一点要铭记!
因此 在java中全部都是值传递 ,不存在引用传递。 Java 语言的参数传递只有「按值传递」。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。
JS:
JS的基本类型,是按值传递的。
var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为1, 未受x = 2赋值所影响
而如果是对象的话:
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.
可以看出,对象的值得传递并不是按引用传递。其实,是按共享传递 call by sharing,准确的说,JS中的基本类型按值传递,对象类型按共享传递的(call by sharing,也叫按对象传递、按对象共享传递)。
该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。注意是函数形参整体 而不是函数形参的属性!!!
总之,基本类型是按值传递,而对于对象来说传入的是对象指向的地址,也可以认为其是特殊的按值传递。如果在函数内对对象的属性进行操作,实际就是对其指向对象的属性进行操作。但是,如果对其整体进行操作(比如:o = 100或者o = []),其实际是新定于了对象,实参的引用地址为新的对象的引用地址,与原来的引用没有任何关系,所以不会对原来的对象造成改变。
最后 再解释一下按共享传递:
var foo = {name:'foo'};
function test(o){
o.name='test';
o={name:'bar'}
}
test(foo);
console.log(foo);
//打印结果为:
Object {name: "test"}
从上面结果可以得出第一:对象不是按值传递的,如果是按值传递的话打印出来的foo的name属性的值不会为test,因为按值传递的话传递的是对象的一个副本,对副本的修改不会影响元对象,所以可以证明对象不是按值传递的!
也可以证明第二:js中对象也不是完全按引用传递的,如果是按引用传递的话在执行o={name:'bar'}这行代码的时候,foo打印的结果应该是Obeject {name:'bar'}了,而结果确是Object {name:'test'},所以综上两点js引
用类型在作为参数传递时是按共享传递的,即传递是是原对象引用的一个副本,但是这个副本跟原对象的引用指向的都是内存中的对象!
以前学习中知道对于js中基础类型是按值传递的,引用类型是按引用传递(其实现在看来是按共享传递),而没有完全理解透彻js中参数传递的方式,所以对js基础知识的理解是非常重要的,一定要掌握牢固,理解透彻,否则浅尝辄止只会让自己是个半桶水,
而成不了一个优秀的前端工程师!
Java中的变量传递机制以及JS中的参数传递机制的更多相关文章
- VB6中的引用传递 与 VB.NET中的引用传递的区别
首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...
- PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent
PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent [PHP中的urlencode和rawurlencode] urlencode ...
- 对JSON.parse()中存在转义字符的解决以及js中替换函数replace()的认识
在工作中,遇到对页面数据进行转存json格式数据后存储在数据库中.然而在显示数据时遇到无法显示json中的数据,产生的bug 问题抛出: 1.首先认识下,在JSON.parse()将后台传过来的字符串 ...
- 【机制】js中的this指向
1.this的使用场景 我们先把this的使用场景分为两大类:函数外和函数内: 函数外的this 就是在全局代码里,直接使用this: "use strict"; let name ...
- 在HTML中使用JavaScript(浏览器对js的加载机制分析)
前言: 向HTML页面中插入JavaScrip的主要方法,就是使用<script>标签.主要探讨<script>标签的在HTML页面的渲染机制.对应的业务场景:从js的加载机制 ...
- java中成员变量和局部变量在内存中的分配
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量:局部变量就是方法或语句块内部定义的变量.局部变量必须初始化. 形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引 ...
- jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?
1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自 ...
- 在properties.xml中定义变量,在application.xml中取值问题
如果为application.xml中的变量赋默认值,同时又在properties.xml中变量赋值,而加载后是取不到properties.xml中的值的问题. 解决这个问题需要加上黑体部分配置: & ...
- java list<string>集合 传递值给js的数组
转载地址:http://blog.sina.com.cn/s/blog_611f65fd0100msc6.html. 1.Action 中代码 List result = n ...
随机推荐
- html符号实体
对网页设计,软考有用的字符实体
- 文件复制的另一种选择,使用FileChannel复制文件
通常来说,FileChannel比普通的缓冲输入输出流有更高的效率 import java.io.File; import java.io.FileInputStream; import ja ...
- artdialog插件--iframe穿透特性
使用artdialog可以实现嵌套页面间的通信. 一.引入插件 //artdialog是建立在jquery上面的所以要首先引入jquery <script src="__CLASSTP ...
- Guid 使用记录
Guid 使用记录; Guid 数据不能设为null 用 00000000-0000-0000-0000-000000000000 代替默认值. 实体新建时,可以赋值为 Guid.Empty 也就是 ...
- php版微信公众平台开发之验证步骤实例详解
本文实例讲述了php版微信公众平台开发之验证步骤.分享给大家供大家参考,具体如下: 微信公众平台开发我们现在做得比较多了,这里给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看 ...
- string(未完待续)
1.string字符串的长度 可以用 a.length() 来测,或者是a.size() 来测 不可以用strlen(a)来求其长度, sizeof(a)是固定值16, 求的是strin ...
- Unity3D中Mathf数学运算函数总结
引入: 看到一个案例注意到函数Mathf.SmoothDamp的使用,游戏中用于做相机的缓冲跟踪和boss直升机跟踪士兵.该函数是Unity3D中Mathf数学运算函数中的一个.一些游戏使用了smoo ...
- Linux tar.gz 、zip、rar 解压 压缩命令
tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...
- JavaUtil_07_HttpUtil_使用Hutool 封装的 HttpUtil
二.参考资料 1.[Hutool]Hutool工具类之Http工具——HttpUtil
- hibernate复习第(4)天
1.hibernate的映射类型.hbm.xml中property中的type属性.这个type属性是表示持久化类中的属性对应数据库中的什么数据类型,用来构建一种映射type的可选值:hibernat ...