JScript中值类型的封箱与拆箱

js|jscript

JScript中对象的expando属性是对Object,Array等引用类型增加成员的一种重要手段,但这种手段在对值类型时就不行了,比如
var str = "string1";
str.method1 = function(){
//do something
};

str.method1();//这里将出错,错误信息(我忘记了)是说str不存在该方法

这样的语句就会运行不了,而在C#编程中值类型存在装箱与拆箱操作来将其转换为引用类型,对此,JScript中也存在值类型,我们也可以做个类似操作,其实现如下,其中toJSON()的操作见这里,其作用是将对象(泛指)用字符串表示出来,以便使用eval函数还原该对象。
Boolean.prototype.box = function(){
    return new Boolean( this );
};
Number.prototype.box = function(){
    return new Number( this );
};
String.prototype.box = function(){
    return new String( this );
};
Boolean.prototype.unbox = function(){
    return eval( this.toJSON() );
};
Number.prototype.unbox = function(){
    return eval( this.toJSON() );
};
String.prototype.unbox = function(){
    return eval( this.toJSON() );
};box即为装箱,unbox即为拆箱。测试代码如下:
str = true.box();
alert( str );
str = str.unbox();
alert( str );至此,我们JScript也有了装箱操作,这有什么好处呢?再看看开头那段语句吧,此时我们就可以像对待Object一样对待String,Boolean,Number这三种值类型,就可以在运行时为值类型的变量增加expando属性,这样是不是很方便呢?
而拆箱操作也很简单,只需要调用类似str.unbox()就搞定。

时间: 2024-10-05 03:42:37

JScript中值类型的封箱与拆箱的相关文章

[CLR via C#]5.3 值类型的装箱和拆箱

原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆上的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量. 2)值类型的字段复制到新的分配的堆内存. 3)返回对象的地址.现在,这个地址是对一个对象的引用,值类型现在是一个引用类型. 拆箱不是直接将装箱过程倒过来.拆箱

Javascript中值类型和引用类型详解

Javascript变量类型 值类型: 字符串.数字.布尔.Null.Undefined 引用类型: 数组.对象.函数 值类型与引用类型的比较 通过两个实例来比较这两种类型 (调试环境: Chrome 开发者工具 Console) 值类型实例 var a = 'hello'; var b = a; b;          /* hello */ a = 'world'; b;          /* hello */ 值类型的变量赋值过程,其实是分配了一块新的内存空间,值相同但两者互不干扰 引用

JavaScript中值类型与引用类型

<script type="text/网页特效"> var str = 'abced'; var obj = new string(str); function newtostring() { return 'hello,world'; } function func(val) { val.tostring = newtostring; } func(str); //ps教程:实际只传入了str的值,因此对它的tostring修改是无意义的 传入的str相当于是他的一个副本

引用类型和值类型,装箱与拆箱,对象的相等与同一

引用类型与值类型 在FCL里面的大多数类型是引用类型,引用类型从托管堆上分配内存,值类型分配在线程栈里.new运算符返回对象的内存地址--指向对象的二进制位,使用引用类型时需要清楚下面几点: 1.从托管堆上分配内存     2.每一个堆上的对象都有额外的成员需要初始化     3.在对象里的其他字节通常置为0    4.从堆分配的对象会导致GC的出现 值类型有装箱和拆箱两种呈现形式,引用类型始终是装箱的形式.值类型从System.ValueType派生,这个类型提供了跟System.Object

C# 引用类型、值类型

CLR支持两种类型:引用类型和值类型,它们的区别是在内存分配方式上的差异:引用类型是从托管堆上分配的:值类型是在线程栈上分配的.而CLR的垃圾回收是针对托管堆的,因此值类型不受垃圾回收器的控制. 在FCL中,所有称为"结构"(struct)的类型都是值类型,所有称为"类"(class)的类型都是引用类型.所有的Struct都直接派生自抽象类System.ValueType,而System.ValueType直接从System.Object派生.所有的枚举都直接从Sy

C#高级(七)类型强制转换,拆箱,装箱

一.装箱和拆箱 装箱就是 将值类型转换为引用类型.拆箱就是 将引用类型转换为值类型. 比如我们非常常用的 .ToString() 方法,就是典型的一个装箱的过程. 再如下面的例子 int i=10; object y=(object) i ; //这就是装箱 int x=(int)y; //这是拆箱. 二.对象的相等比较 在C#中,有四种比较相等的方法. 1.ReferenceEquals() 该方法是一个静态方法,用来判断两个引用是否指向同一个实例.也就是是否 指向同一个内存地址,如果是,则返

jdk1.5新特性4之自动装箱和自动拆箱与享元模式

  一 基本概念 1 装箱 把基本类型用它们相应的引用类型包装起来,使其具有对象的性质.如int-->Integer,float-->Float. 自动装箱 Integer a = 100,编译器调用的是static Integer valueOf(int i)                2 拆箱 和装箱相反,将引用类型的对象简化成值类型的数据 自动拆箱 int b = new Integer(100); int c = a +2;   二 是否相等 例一 Integer a = new

C# 装箱和拆箱的知识回顾_C#教程

装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的一个过程. 当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上. 拆箱将从对象中提取值类型. 装箱是隐式的:拆箱是显式的. 装箱和拆箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值都被视为一个对象. 在下面的示例中,将整型变量 i 进行了装箱并分配给对象 obj. static void Main(string[] args) { var i = 123; //

list-link中使用List&amp;amp;lt;object&amp;amp;gt;还需要装箱拆箱么?

问题描述 link中使用List<object>还需要装箱拆箱么? link中使用List还需要装箱拆箱么? 解决方案 首先搞清楚,装箱拆箱在什么情况下发生,当你将堆栈上的变量放入维持object引用的集合的时候,必然要装箱.试想,如果List不装箱,而直接存int,那么它存另一种类型,比如string 存入的是引用(地址),岂不是乱套了,它怎么知道这个是int的值还是string的引用.所以必须都装箱成对象. 所以结论就是,需要.