JScript 8.0
复制、传递和比较数据

JScript 复制、传递和比较数据的方法取决于数据的存储方式,而数据的存储方式又取决于数据的类型。JScript 以传值方式或传址方式存储数据。

传值方式和传址方式

JScript 以“传值方式”复制、传递和比较数字和布尔值(truefalse)。此过程在计算机内存中分配一个空间,然后将原始项的值复制到该处。对原始项的更改不会影响该副本(反之亦然),这是因为两者是单独的实体。如果两个数字或布尔值具有相同的值,则认为它们相等。

JScript 以“传址方式”复制、传递和比较对象、数组和函数。实质上,此过程创建一个对原始项的引用,并将该引用当作副本一样使用。对原始项的更改会同时更改原始项和副本(反之亦然)。实际上只有一个实体;副本只是数据的另一个引用。

若要成功地以传址方式比较两个变量,这两个变量必须恰好引用同一个实体。例如,两个不同的 Array 对象的比较结果始终是不相等(即使它们包含相同的元素)。若要使比较成功,其中一个变量必须是对另一个变量的引用。若要检查两个数组是否包含相同的元素,请比较 toString() 方法的结果。

最后,JScript 以传址方式复制和传递字符串。字符串是否为对象决定了字符串的比较方式。对两个 String 对象(用 new String("something") 创建)以引用方式进行比较。如果其中一个(或两个)字符串是常值或基元字符串值,则以传值方式对它们进行比较。有关更多信息,请参见 JScript 赋值与相等

Note注意

ASCII 和 ANSI 字符集均按将大写字母排在小写字母前面的序列顺序进行构造。例如,“Zoo”相比之下“小于”“aardvark”。如果要执行不区分大小写的匹配,则可以对两个字符串调用 toUpperCase()toLowerCase()

函数参数

当 JScript 以传值方式向函数传递参数时,它就会制作一个单独的参数副本(仅存在于函数内部)。即使对象和数组以传址方式来传递,如果函数中的新值直接将其改写,则新值将不会在函数之外得到反映。只有对对象属性或数组元素的更改才会在函数外可见。

例如,以下程序有两个函数。第一个函数改写输入参数,它可进一步防止参数更改影响原始输入参数。第二个函数更改对象的属性而不改写该对象。

function clobber(param) {
   // Overwrite the parameter; this will not be seen in the calling code
   param = new Object();
   param.message = "This will not work.";
}

function update(param) {
    // Modify the property of the object; this will be seen in the calling code.
    param.message = "I was changed.";
}

// Create an object, and give it a property.
var obj = new Object();
obj.message = "This is the original.";

// Call clobber, and print obj.message.
clobber(obj);
print(obj.message);

// Call update, and print obj.message.
update(obj);
print(obj.message);

该代码的输出为:

This is the original.
I was changed.

数据比较

JScript 可以按传值方式或传址方式比较数据。若要以传值方式执行测试,JScript 比较两个截然不同的项以确定它们是否相等。通常,这种比较是逐字节进行的。当按传址方式测试时,它检查两个项是否引用同一个项。如果是,它们的比较结果则为相等;如果不是,即使它们包含完全相同的值(逐字节比较),它们的比较结果仍是不相等。

根据字符串是对象与否,可以按传值方式或传址方式比较字符串。如果两个字符串均为 String 对象,则以传址方式比较字符串;否则以传值方式比较。这样,如果两个字符串是单独创建的但具有相同的内容,则两者的比较结果为相等。若要比较两个 String 对象的值,先使用 toStringvalueOf 方法将对象转换为非对象字符串,然后比较生成的字符串。有关更多信息,请参见 JScript 赋值与相等

请参见