2007年10月9日星期二

深入Javascript对象比较(一) - 概述

 

概述

 

1.1 类型

 

Javascript 数据类型分为值类型引用类型,其中值类型包括字符串实体(例如:"string" ),数值实体(例如:100 )和布尔值实体(如:true )。而其他的复杂类型都属于引用类型,例如日期型( new Date() ),正则表达式(/a/gi, new RegExp("a", "gi") )数组( [1,2,3], new Array() )函数(function(){}, new Function() )和对象({a:"a", b:100}, new Object() )。这些都是Javascript 固有的数据类型,而用户自定义类型都属于引用类型(如:var Person = function(name){this.name=name;}; ),它们都只能使用new 关键字实例化为具体对象(new Person("hotoo") )。

 

为了理解Javascript 对象的类型,我们来看一些如下代码:

// test instanceof and typeof:

var instStr = ['"string"', '100' , 'true', '/a/g' , '[1,2,3]' , 'function(){}', '{}', 'null', 'undefined' ];

var inst = ["string", 100, true, /a/g, [1 ,2,3 ], function (){}, {}, null, undefined];

var ObjsStr = ["String", "Number" , "Boolean", "RegExp" , "Array", "Function", "Date" , "Object"];

var Objs = [String, Number , Boolean, RegExp, Array, Function, Date, Object];

jsoutInst ( "instanceof" , ObjsStr, Objs , instStr, inst);

 

 

 

function jsoutInst (methodName, tsStr , ts , osStr, os ){

    document.write ("<table border='1'><tr>" );

    document.write ("<td><strong>" +methodName+ "</strong></td>" );

    for (var i= 0; i< tsStr. length; i++){

       document.write ("<td>" +tsStr[i ]+"</td>" );

    }

    document.write ("</tr>" );

    for (var i= 0; i< os. length; i++){

       document.write ("<tr><td>" +osStr[i ]+"</td>" );

       for (var j= 0; j< ts. length; j ++){

           document.write ("<td>" +(os[i ] instanceof ts[j]? "<strong>true</strong>" :"false")+"</td>" );

       }

       document.write ("</tr>" );

    }

    document.write ("</table><br />" );

}

 

var typesStr = ["string", "number" , "boolean", "array" , "function", "date", "object" , "undefined"];

jsoutType ( "typeof" , typesStr, instStr , inst);

function jsoutType (methodName, tsStr , osStr , os){

    document.write ("<table border='1'><tr>" );

    document.write ("<td><strong>" +methodName+ "</strong></td>" );

    for (var i= 0; i< tsStr. length; i++){

       document.write ("<td>" +tsStr[i ]+"</td>" );

    }

    document.write ("</tr>" );

    for (var i= 0; i< os. length; i++){

       document.write ("<tr><td>" +osStr[i ]+"</td>" );

       for (var j= 0; j< tsStr. length; j ++){

           document.write ("<td>" +(typeof os[ i] == tsStr[ j]?"<strong>true</strong>" :"false" )+"</td>" );

       }

       document.write ("</tr>" );

    }

    document.write ("</table><br />" );

}

上面的代码很简单,第一个函数判断对象实例是否是某个类的实例(instanceof ),第二个函数对比对象实例是否与某类型(typeof )相等,他们将输出两个表格,我们来对比一下(为了方便阅读,这里将说明插在相应表格下。 )。


instanceof String Number Boolean RegExp Array Function Date Object
"string" false false false false false false false false
100 false false false false false false false false
true false false false false false false false false
/a/g false false false true false false false true
[1,2,3] false false false false true false false true
function(){} false false false false false true false true
{} false false false false false false false true
null false false false false false false false false
undefined false false false false false false false false

 

通过(instanceof )这个表格可以看出,值类型( "string", 100, true 等)不是任何对象的实体(instance ),而引用类型(/a/g, [1,2,3], function(){} {} )既是本身类型的实体,又是其父类型的实体(所有类型都继承自Object 类型)。

所有通过引用类型(包括值类型的wrapperString, Number Booleannew 出来的对象,都是其对应类和其父类(这里是Object )的实例。

虽然值类型不是其对应wrapper 类的实例,但是值类型却可以直接使用其wrapper 类的属性和方法,就如同值类型是其 wrapper 类的实例一样。例如:"ABC".toLowerCase()

 

typeof string number boolean array function date object undefined
"string" true false false false false false false false
100 false true false false false false false false
true false false true false false false false false
/a/g false false false false false false true false
[1,2,3] false false false false false false true false
function(){} false false false false true false false false
{} false false false false false false true false
null false false false false false false true false
undefined false false false false false false false true

 

2 条评论: