Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选

首页 / 脚本样式 / JavaScript / JavaScript面向对象的支持(下)

JavaScript面向对象的支持(下)2010-02-21 博客园 账号难注册八、JavaScript面向对象的支持

4. 实例和实例引用

在.NET Framework对CTS(Common Type System)约定“一切都是对象”,并分为“值类型”和“引用类型”两种。其中“值类型”的对象在转换成“引用类型”数据的过程中,需要进行一个“装箱”和“拆箱”的过程。在JavaScript也有同样的问题。我们看到的typeof关键字,返回以下六种数据类型:

"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。我们也发现JavaScript的对象系统中,有String、Number、Function、Boolean这四种对象构造器。那么,我们的问题是:如果有一个数字A,typeof(A)的结果,到底会是"number"呢,还是一个构造器指向function Number()的对象呢?

// 关于JavaScript的类型的测试代码

function getTypeInfo(V) {
return (typeof V == "object" ? "Object, construct by "+V.constructor
: "Value, type of "+typeof V);
}var A1 = 100;
var A2 = new Number(100);
document.writeln("A1 is ", getTypeInfo(A1), "<BR>");
document.writeln("A2 is ", getTypeInfo(A2), "<BR>");
document.writeln([A1.constructor === A2.constructor, A2.constructor === Number]);

测试代码的执行结果如下:

A1 is Value, type of number
A2 is Object, construct by function Number() { [native code] }
true,true

我们注意到,A1和A2的构造器都指向Number.这意味着通过constructor属性来识别对象,(有时)比typeof更加有效.因为"值类型数据"A1作为一个对象来看待时,与A2有完全相同的特性.

--除了与实例引用有关的问题.

参考JScript手册,我们对其它基础类型和构造器做相同考察,可以发现:

- 基础类型中的undefined、number、boolean和string,是“值类型”变量

- 基础类型中的array、function和object,是“引用类型”变量

- 使用new()方法构造出对象,是“引用类型”变量下面的代码说明“值类型”与“引用类型”之间的区别:

// 关于JavaScript类型系统中的值/引用问题

var str1 = "abcdefgh", str2 = "abcdefgh";
var obj1 = new String("abcdefgh"), obj2 = new String("abcdefgh");document.writeln([str1==str2, str1===str2], "<br>");
document.writeln([obj1==obj2, obj1===obj2]);

测试代码的执行结果如下:

-----------
true, true
false, false
-----------

我们看到,无论是等值运算(==),还是全等运算(===),对"对象"和"值"的理解都是不一样的.

更进一步的理解这种现象,我们知道:

- 运算结果为值类型,或变量为值类型时,等值(或全等)比较可以得到预想结果 - (即使包含相同的数据,)不同的对象实例之间是不等值(或全等)的 - 同一个对象的不同引用之间,是等值(==)且全等(===)的但对于String类型,有一点补充:根据JScript的描述,两个字符串比较时,只要有一个是值类型,则按值比较.这意味着在上面的例子中,代码"str1==obj1"会得到结果true.而全等(===)运算需要检测变量类型的一致性,因此"str1===obj1"的结果返回false.

JavaScript中的函数参数总是传入值参,引用类型(的实例)是作为指针值传入的.因此函数可以随意重写入口变量,而不用担心外部变量被修改.但是,需要留意传入的引用类型的变量,因为对它方法调用和属性读写可能会影响到实例本身.--但,也可以通过引用类型的参数来传出数据.

最后补充说明一下,值类型比较会逐字节检测对象实例中的数据,效率低但准确性高;而引用类型只检测实例指针和数据类型,因此效率高而准确性低.如果你需要检测两个引用类型是否真的包含相同的数据,可能你需要尝试把它转换成"字符串值"再来比较.