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中的参数传递机制的更多相关文章

  1. VB6中的引用传递 与 VB.NET中的引用传递的区别

    首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...

  2. PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent

    PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent [PHP中的urlencode和rawurlencode] urlencode ...

  3. 对JSON.parse()中存在转义字符的解决以及js中替换函数replace()的认识

    在工作中,遇到对页面数据进行转存json格式数据后存储在数据库中.然而在显示数据时遇到无法显示json中的数据,产生的bug 问题抛出: 1.首先认识下,在JSON.parse()将后台传过来的字符串 ...

  4. 【机制】js中的this指向

    1.this的使用场景 我们先把this的使用场景分为两大类:函数外和函数内: 函数外的this 就是在全局代码里,直接使用this: "use strict"; let name ...

  5. 在HTML中使用JavaScript(浏览器对js的加载机制分析)

    前言: 向HTML页面中插入JavaScrip的主要方法,就是使用<script>标签.主要探讨<script>标签的在HTML页面的渲染机制.对应的业务场景:从js的加载机制 ...

  6. java中成员变量和局部变量在内存中的分配

    对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量:局部变量就是方法或语句块内部定义的变量.局部变量必须初始化. 形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引 ...

  7. jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?

    1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自 ...

  8. 在properties.xml中定义变量,在application.xml中取值问题

    如果为application.xml中的变量赋默认值,同时又在properties.xml中变量赋值,而加载后是取不到properties.xml中的值的问题. 解决这个问题需要加上黑体部分配置: & ...

  9. java list<string>集合 传递值给js的数组

    转载地址:http://blog.sina.com.cn/s/blog_611f65fd0100msc6.html. 1.Action 中代码              List result = n ...

随机推荐

  1. 深入理解JVM - 晚期(运行期)优化

    在部分商用虚拟机中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或者代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code) ...

  2. c版基于链表的插入排序(改进版)

    1. [代码][C/C++]代码 /** * @todo    c版基于链表的插入排序 * @author  Koma **/#include<stdio.h>#include<st ...

  3. 仿联想商城laravel实战---2、后端页面搭建(验证码如何在页面中使用)

    仿联想商城laravel实战---2.后端页面搭建(验证码如何在页面中使用) 一.总结 一句话总结: 放在img里面,img的src就是生产验证码的控制器路径: img src="/admi ...

  4. js文件报错Syntax error on token "Invalid Regular Expression Options", no accurate correction

    Syntax error on token "Invalid Regular Expression Options", no accurate correction 1.选中报错的 ...

  5. python ddt 重写

    对此方法重写 def mk_test_name(name, value, index=0): 重写前 index = "{0:0{1}}".format(index + 1, in ...

  6. git内部原理-第一篇

    本人计划写一些关于<git内部原理>的文章 计划每周一篇

  7. QListWidget拖放

    setDragEnabled() 允许拖 setAcceptDrops()允许放 setDragDropMode(QAbstractItemView.DragDrop)设置拖拽模式 setSelect ...

  8. Agc012_E Camel and Oases

    传送门 题目大意 坐标轴上有$n$个坐标,第$i$个坐标是$x_i$,初始你有一个容量$V$,当两个给定的坐标距离不超过$V$时,你可以从一个坐标到达另一个坐标,同时你还可以令$V=\lfloor \ ...

  9. 调试 ASP 程序脚本

    调试 ASP 脚本 无论您的计划多么精密.经验多么丰富,脚本错误 (bug) 可能在最初就使您的 ASP 服务器端的脚本无法正确运行.也就是说调试,即查找和纠正脚本错误,对开发一个成功的和强健的 AS ...

  10. 问题4:对dict、list、tuple中的元素排序

    一)对字典中元素排序   方法一:利用sorted的key参数进行排序 from random import randint date = {k:randint(0, 20) for k in ran ...