先来看一下Javascript的情况(下面所说的基本类型和简单类型是一个意思):

Javascript中变量会存在两种情况,一种是基本类型的,一共有五种,有null、Bollean、undefined、number、还有string。基本类型是指简单的数据段,这些类型的值是直接存储在变量中的,也就是说,访问变量是是直接访问变量中的值,是按值访问的。另外一种是引用类型,引用类型的值保存在内存中(堆),如果要访问引用类型的值,就要通过这个指向该对象的引用类型的变量来进行访问。Javascript不允许直接操作对象的内存空间。值得注意的时Js中的string类型是一个值类型。不论是值类型还是引用类型,Js中的变量只是一个保存值的名字,这个名字可以用来保存任意类型的值。定义一个变量后,这个变量可以随时随地的保存其他任何类型的值。简单类型的变量和引用类型的变量的区别在于复制的机制不同。复制一个基本类型的变量时会将原有变量的值重新复制一份,也就是说复制之后这两个时完全独立的,对一个进行操作不会引起另一个的改变。而复制一个引用类型的变量时,也是将变量中的值重新复制一份出来,不同的是引用类型的变量中包含的值就是一个指针,指向内存中(堆)真正的对象。也就是说复制后两个变量是共享一个对象,其中任何一个进行操作后都会去改变这个对象:

var obj1 = new Object();
var obj2 = obj1;
obj1. name = "Nicholas";
alert( obj2. name); //"Nicholas"

传递参数方面JS都是按值进行传递的。

ECMAScript 中 所有 函数 的 参数 都 是按 值 传递 的。也就是说,把函数外部的值复制给函数内部的参数, 就和把值从一个变量复制到另一个变量一样。 基本类型值的传递如同基本类型变量的复制一样, 而引用类型值的传递, 则如同引用类型变量的复制一样。 有不少开发人员在这一点上可能会
感到困惑,因为访问变量有按值和按引用两种方式, 而参数只能按值传递。 泽卡斯(Zakas. Nicholas C.). JavaScript高级程序设计(第3版) (图灵程序设计丛书) (Kindle 位置 2623-2626). 人民邮电出版社. Kindle 版本.

  

 

在来看一下C#的情况:C#也包含两种数据类型,一种是简单数据类型,有byte、short、int、long、flaot、double、boolean、char等,这些简单数据类型都是简单数据类型,也叫做值类型,其值存储在变量本身,对这种类型的变量进行操作时会直接操作这个变量本身,与Js不同的是string是对象类型,值存储在堆上。另外一种就是对象类型,也叫做引用类型,对象是存储在堆上进行实例化后的一种叫法,当new一个对象类型时,会返回一个指向该对象的引用,这个引用(值)存储在一个栈上的变量中(有关实例化值类型变量后具体的存储位置,和值类型变量实例化的时机和地方有关。在C# in depth中有介绍。),也就是说,该变量的值保存的是一个引用,操作对象时都是通过这个引用来操作保存在堆上的对象。这个也就造成了C#中值类型和引用类型的根本区别在于复制的机制不同。在c#不论是值类型还是引用类型都可以进行按值传递和按引用传递,按值传递就是将变量的值进行一份拷贝,而按引用进行传递实际上是传递一个原有变量的“别名”,也就是说,按值传递的话操作的是另外一份数据,而按引用传递的话是操作的同一份数据,但是这个在值类型和引用类型中所引发的后果也是稍有不同的,值类型因为其值本身在变量中保存,如果按值进行传递的话那连同这个变量和值是一起被拷贝的,就是说在栈上另外开辟了一块空间来保存这个副本,那这样的话对原有的值是不会产生任何影响的。看下面的例子:

class Program
{
static void Main(string[] args)
{
int shit = 2;
Console.WriteLine("before:"+shit);//返回2
DoSome(shit);
Console.WriteLine("after:"+shit);//返回2
Console.WriteLine(DoSome(shit));//返回3
Console.ReadKey();
} public static int DoSome(int shit)
{
shit++;
return shit;
}
}

  而如果按引用去传递一个值类型的变量,那么就是将原有变量起了一个别名后传递了出去,实际上“别名”和原有的变量共享了一份值。那么不论是对“别名”进行操作还是对原有变量进行操作都会改变值,看下面的例子:

class Program
{
static void Main(string[] args)
{
int shit = 2;
Console.WriteLine("before:"+shit);//返回2
DoSome(ref shit);
Console.WriteLine("after:"+shit);//返回3
Console.WriteLine(DoSome(ref shit));//返回4
Console.ReadKey();
} public static int DoSome(ref int shit)
{
shit++;
return shit;
}
}

  上面说的都是C#中值类型的按值传递和按引用传递的区别。顺便说一下,C#中按引用传递分为ref和out,这两个关键字都是用来表示按引用进行传递,就是对实参的初始化的时机有所不同。一个是必须在使用前进行初始化(out),ref则没有这样的要求。

对于C#中引用类型的按值传递和按引用传递,又与值类型的按值传递和按引用传递的表现有所不同,引用类型的按值传递同理也是连变量带值都拷贝了一份,不同于值类型的是引用类型变量的值本身只是一个指向对象的引用,保存的是一个地址,所以引用类型的变量按值传递时也会有可能去改变堆上的变量,也有可能不会改变,比如将引用类型的变量按值传递出去之后马上对它进行一个new的操作,从而使它重新指向一个堆上的新地址。:)而对引用类型的变量进行按引用传递时同理也是其一个别名,这个别名和原来的对象都是共享一个值(指向堆上对象的引用)所以对这个别名进行的任何操作都会改变堆上的这个对象。

18:21:51

Javascript与C#对变量的处理方式的更多相关文章

  1. java基础58 JavaScript的几种格式和变量的声明方式(网页知识)

    1.JavaScript的几种格式 1.1.JavaScript的特点 1.跨平台性    2.安全性.(javaScript代码不能直接访问电脑硬盘上的信息) 1.2.Java与javaScript ...

  2. Javascript中的循环变量声明,到底应该放在哪儿?

    相信很多Javascript开发者都在声明循环变量时犹豫过var i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪一种方式和ecma标准 ...

  3. JavaScript的作用域和变量对象

    变量对象 先来说说什么是变量对象.变量对象中又存储了什么东西吧. JavaScript中的运行环境包含全局运行环境和函数运行环境这两种,每进入到一个运行环境都会创建一个变量对象,这个对象中记录了在当前 ...

  4. javascript基础语法备忘录-变量和数据类型

    //javascript基础语法备忘录-变量和数据类型 // 定义变量使用var关键字 后面跟变量名,不要使用eval 和arguments为变量名 var message = "hi&qu ...

  5. smarty中三种变量的访问方式

    在模板中smarty有三种变量,第一种,php分配的变量,第二种配置文件里的变量,第三种,PHP全局数组里的变量,配置文件里变量的访问方式可以是{#bgcolor#},"#"必须紧 ...

  6. JavaScript获取后台C#变量以及调用后台方法

    http://www.educity.cn/develop/495493.html 有时需要在JavaScript中获取后台变量的值,来判断JavaScript的执行逻辑,或者需要调用C#后台方法获取 ...

  7. JavaScript神一样的变量系统

    话说上一篇介绍了JavaScript故事版的身世之谜.看官你估计也明白JavaScript出生之时,就未曾托于重任.布兰登-艾奇估计也没料到今天的JavaScript变得如此重要.要不然,当年他也不会 ...

  8. Java中final变量的初始化方式

    原文转自:http://blog.csdn.net/zhangjk1993/article/details/24196847 public class FinalTest1 { //--------- ...

  9. [转]javascript指定事件处理程序包括三种方式:

    javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...

随机推荐

  1. 【漫画解读】HDFS存储原理

    根据Maneesh Varshney的漫画改编,以简洁易懂的漫画形式讲解HDFS存储机制与运行原理,非常适合Hadoop/HDFS初学者理解. 一.角色出演 如上图所示,HDFS存储相关角色与功能如下 ...

  2. 我为什么要谈KeepAlive(文末增加nginx 负载tcp长连接保持 demo)

    http://blog.sina.com.cn/s/blog_e59371cc0102ux5w.html 最近工作中遇到一个问题,想把它记录下来,场景是这样的: 从上图可以看出,用户通过Client访 ...

  3. Cglib动态代理实现方式

    Cglib动态代理实现方式 我们先通过一个demo看一下Cglib是如何实现动态代理的. 首先定义个服务类,有两个方法并且其中一个方法用final来修饰. public class PersonSer ...

  4. UVA11925-Generating Permutations(贪心)

    Problem UVA11925-Generating Permutations Accept: 214  Submit: 1429Time Limit: 1000 mSec Problem Desc ...

  5. Android中Bitmap对象和字节流之间的相互转换

    android 将图片内容解析成字节数组,将字节数组转换为ImageView可调用的Bitmap对象,图片缩放,把字节数组保存为一个文件,把Bitmap转Byte   import java.io.B ...

  6. 自然周与自然月的Hive统计SQL

    按照周或者月统计活跃数: 周: SELECT week, COUNT(DISTINCT pin), business_type FROM ( SELECT DISTINCT user_log_acct ...

  7. EL表达式运算符使用

    EL表达式关系运算符的使用 == eq 等于 != ne 不等于 > gt 大于 < lt 小于 >= ge 大于等于 <= le 小于等于 举例说明 > 或者 gt, ...

  8. 【移动端】icon中ng-cordova使用

    cordova介绍 Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等. Cordova支持如下7种移动操作系统:iOS ...

  9. docker 13 dockerfile的保留字指令

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...

  10. Ubuntu16.04之安装Nutch

    1.下载Nutch wget http://mirrors.shu.edu.cn/apache/nutch/2.3.1/apache-nutch-2.3.1-src.zip 2.解压 unzip ap ...