02 JScript 函数

来源:互联网 发布:工业控制软件 编辑:程序博客网 时间:2024/05/18 19:45

JScript 函数

Microsoft Jscript 函数执行操作,也可以返回值。某些时候是计算或比较的结果。函数又被称为“全局方法”。

一个函数中包含有几个操作。这样可使得代码更合理化。可以写一组语句并给其命名,然后通过调用它并传递其需要的信息来运行整组语句。

给函数传递信息可以把信息放在函数名称后面的圆括号中。传递给函数的信息称作参数。某些函数根本不带任何参数,而其他函数带一个或者多个参数。在某些函数中,参数的个数取决于如何使用该函数。

Jscript 支持两种函数:一类是语言内部的函数,另一类是自己创建的。

特殊的内部函数

Jscript 语言包含很多内部函数。某些函数可以操作表达式和特殊字符,而其他函数将字符串转换为数值。一个有用的内部函数是eval()。该函数可以对以字符串形式表示的任意有效的 Jscript代码求值。eval() 函数有一个参数,该参数就是想要求值的代码。下面给出一个使用本函数的示例。

var anExpression = "6 * 9 % 7";
var total = eval(anExpression); // 将变量 total 赋值为 5
var yetAnotherExpression = "6 * (9 % 7)";
total = eval(yetAnotherExpression) // 将变量 total 赋值为 12
// 将一个字符串赋给 totality (注意嵌套引用)
var totality = eval("’...surrounded by acres of clams.’");

有关内部函数的详细信息请参考语言参考。

创建自己的函数

在必要的时候,可以创建并使用自己的函数。一个函数的定义中包含了一个函数语句和一个 Jscript 语句块。

下面示例中的 Checktriplet 函数以三角形的边长为参数。通过查看三条边的长度是否可以组成一个毕达哥拉斯三元组(直角三角形斜边长度的平方等于其他两条边长的平方和)来计算该三角形是否为直角三角形。实际测试时 checkTriplet 函数要调用另两个函数中的一个函数。

注意在浮点数测试版本中极小数(“epsilon”)作为测试变量的使用。由于浮点运算的不确定性和舍入误差,除非问题中的三个值均已知为整数,直接测试这三个数是否组成毕达哥拉斯三元组是不可行的。因为直接的测试更为准确,本示例中的代码确定其是否可行,如果可行则使用它。

var epsilon = 0.00000000001; // 一些需要测试的极小数字。
 
// 测试整数的函数。
function integerCheck(a, b, c) 
{
   // 测试。
   if ( (a*a) == ((b*b) + (c*c)) )   
      return true;
 
   return false;
} // 整数检查函数的结尾。
 
// 测试浮点数的函数。
function floatCheck(a, b, c)   
{
   // 得到测试数值。
   var delta = ((a*a) - ((b*b) + (c*c)))
 
   // 测试需要绝对值
   delta = Math.abs(delta);
 
   // 如果差小于 epsilon,那么它相当接近。
   if (delta < epsilon)   
      return true;
 
   return false;
} // 浮点检查函数的末尾。
 
 
// 三元检查。
function checkTriplet(a, b, c)
{ 
   // 创建临时变量,用于交换值
   var d = 0; 
 
   // 先将最长的移动到位置“a”。
 
   // 需要的话交换 a  b
   if (b > a)
   {
      d = a;
      a = b;
      b = d;
   }
 
   // 需要的话交换 a  c
   if (c > a)
   {
      d = a;
      a = c;
      c = d;
   }
 
   // 测试全部的 3 个值,看其是否为整数?
   if (((a % 1) == 0) && ((b % 1) == 0) && ((c % 1) == 0))
   { 
      // 如果成立,使用精确检查。
      return integerCheck(a, b, c); 
   }
   else
   {
      // 如果不成立,取尽可能相近的。
      return floatCheck(a, b, c); 
   }
} // 三元检查函数的末尾。
 
// 下面的三个语句赋给范例值,用于测试。
var sideA = 5;
var sideB = 5;
var sideC = Math.sqrt(50.001);
 
// 调用函数。调用后,'result' 中包含了结果。
var result = checkTriplet(sideA, sideB, sideC);

 

 

JScript对象

Jscript 对象是属性和方法的集合。一个方法就是一个函数,是对象的成员。属性是一个值或一组值(以数组或对象的形式),是对象的成员。Jscript 支持四种类型的对象:内部对象、生成的对象、宿主给出的对象(如 Internet 浏览器中的windowdocument)以及 ActiveX 对象(外部组件)。

作为数组的对象

在 Jscript 中,对象和数组几乎是以相同的方式处理的。对象和数组均可以被赋予任意值,实际上数组只是一种特殊的对象。数组和对象的区别在于数组有一个“奇妙的”length 属性,而对象没有。这意味着可以给数组的一个元素赋予比其他元素更大的值。例如,myArray[100] = "hello" — 然后length 属性将自动地被更新为 101(新长度)。同样,如果修改数组的length 属性,将删除不再是数组部分的元素。

Jscript 中所有的对象均支持“expando”属性或那些可以在运行时动态添加和删除的属性。这些属性可以有包含数字的任意名称。如果属性的名称是简单的标识符<<参考标识符规则>>,可以在对象名称的后面加句点,例如:

var myObj = new Object();
 
// 添加两个 expando 属性,'name'  'age'
myObj.name = "Fred";
myObj.age = 42;

如果属性名称不是一个简单的标识符,或者在写脚本的时候不知道,可以在方括号中使用任意表达式来索引属性。在 Jscript中所有 expando 属性的名称在被添加到对象之前被转换为字符串。

var myObj = new Object();
 
// 添加两个无法写在 object.property 
// 法中的 expando 属性。
// 第一个属性包含无效字符(空格),
// 所以必须写在方括号里。
myObj["not a valid identifier"] = "This is the property value";
 
// 第二个 expando 名称是一个数字,
// 所以也必须写在方括号里。
myObj[100] = "100";

传统的作法是赋给数组元素以 0 开始的数字索引。这些数组元素与 length 属性相交互。然而,由于所有的数组也是对象,也支持 expando 属性。请注意,虽然如此,expando 属性并不以任何方式与length 属性相交互。例如:

// 三个元素的数组
var myArray = new Array(3);
 
// 添加数据
myArray[0] = "Hello";
myArray[1] = 42;
myArray[2] = new Date(2000, 1, 1);
 
// 显示数组的长度 3
window.alert(myArray.length);
 
// 添加某些 expando 属性
myArray.expando = "JScript!";
myArray["another Expando"] = "Windows";
 
// 仍然显示 3,因为两个 expando 属性
// 并不影响长度。
window.alert(myArray.length);

虽然 Jscript 并不直接支持多维数组,但是可以在数组元素中存储任意种类的数据 — 包含其他数组。所以通过在另一个数组的元素里存储其他数组可以得到多维数组的特性。例如,下面的代码为最大为 5 的数字建立了乘法表:

// 若是更大的表请改变本数
var iMaxNum = 5;
// 循环计数
var i, j;
 
// 新数组。由于数组从 0 开始计数,
// 而不是 1,所以数组大小为 iMaxNum + 1
var MultiplicationTable = new Array(iMaxNum + 1);
 
// 为每个主要的数做循环(表中的每一行)
for (i = 1; i <= iMaxNum; i++)
{
    // 生成表中的列
    MultiplicationTable[i] = new Array(iMaxNum + 1);
 
    // 将乘法的结果存在行中
    for (j = 1; j <= iMaxNum; j++)
    {
        MultiplicationTable[i][j] = i * j;
    }
}
 
window.alert(MultiplicationTable[3][4]); // 显示 12
window.alert(MultiplicationTable[5][2]); // 显示 10
window.alert(MultiplicationTable[1][4]); // 显示 4

 

 

创建自己的对象

要创建自己的对象实例,必须首先为其定义一个构造函数。构造函数创建一个新对象,赋予对象属性,并在合适的时候赋予方法。例如,下面的示例为 pasta 对象定义了构造函数。注意this 关键字的使用,它指向当前对象。

// pasta 是有四个参数的构造器。
function pasta(grain, width, shape, hasEgg)
{
    // 是用什么粮食做的?
    this.grain = grain;
 
    // 多宽?(数值)
    this.width = width;     
 
    // 横截面形状?(字符串)
    this.shape = shape;   
 
// 是否加蛋黄?(boolean
    this.hasEgg = hasEgg;  
}

定义了对象构造器后,用 new 运算符创建对象实例。

var spaghetti = new pasta("wheat", 0.2, "circle", true);
var linguine = new pasta("wheat", 0.3, "oval", true);

可以给对象实例添加属性以改变该实例,但是用相同的构造器生成的其他对象定义中并不包括这些属性,而且除非你特意添加这些属性那么在其他实例中并不显示出来。如果要将对象所有实例的附加属性显示出来,必须将它们添加到构造函数或构造器原型对象(原型在高级文档中讨论)中。

// spaghetti 的附加属性。
spaghetti.color = "pale straw";
spaghetti.drycook = 7;
spaghetti.freshcook = 0.5;
 
var chowFun = new pasta("rice", 3, "flat", false); 
// chowFun 对象或其他现有的 pasta 对象
// 都没有添加到 spaghetti 对象
// 的三个新属性。
 
 
// 将属性‘foodgroup’加到 pasta 原型对象
// 中,这样 pasta 对象的所有实例都可以有该属性,
// 包括那些已经生成的实例。
pasta.prototype.foodgroup = "carbohydrates"
 
// 现在 spaghetti.foodgroupchowFun.foodgroup,等等
// 均包含值“carbohydrates”。

在定义中包含方法

可以在对象的定义中包含方法(函数)。一种方法是在引用别处定义的函数的构造函数中添加一个属性。例如,下面的示例扩充上面定义的 pasta 构造函数以包含toString 方法,该方法将在显示对象的值时被调用。

// pasta 是有四个参数的构造器。
// 第一部分与上面相同。
function pasta(grain, width, shape, hasEgg)
{
    // 用什么粮食做的?
    this.grain = grain;
 
    // 多宽?(数值)
    this.width = width;     
 
    // 横截面形状?(字符串)
    this.shape = shape;   
 
    // 是否加蛋黄?(boolean
    this.hasEgg = hasEgg;  
 
    // 这里添加 toString 方法(如下定义)。
    // 注意在函数的名称后没有加圆括号;
    // 这不是一个函数调用,而是
    // 对函数自身的引用。
    this.toString = pastaToString;
}
 
// 实际的用来显示 past 对象内容的函数。
function pastaToString()
{
    // 返回对象的属性。
 
    return "Grain: " + this.grain + "\n" +
        "Width: " + this.width + "\n" +
        "Shape: " + this.shape + "\n" +
        "Egg?: " + Boolean(this.hasEgg);
}
 
var spaghetti = new pasta("wheat", 0.2, "circle", true);
// 将调用 toString() 并显示 spaghetti 对象
// 的属性(需要Internet 浏览器)。
window.alert(spaghetti);
 

内部对象

Microsoft Jscript 提供了 11 个内部(或“内置”)对象。它们是ArrayBooleanDateFunctionGlobalMathNumberObjectRegExpError 以及 String 对象。每一个对象有相关的方法和属性,这在语言参考中有详细的描述。本节中也描述了某些对象。

Array 对象

数组下标可以被认为是对象的属性,它是通过数字索引来引用的。注意添加到数组中的已命名的属性不能通过数字来索引;它们是与数组元素分离的。

使用 new 运算符和 Array()构造器 生成一个新的数组,如下面的示例。

var theMonths = new Array(12);

theMonths[0] = "Jan";

theMonths[1] = "Feb";

theMonths[2] = "Mar";

theMonths[3] = "Apr";

theMonths[4] = "May";

theMonths[5] = "Jun";

theMonths[6] = "Jul";

theMonths[7] = "Aug";

theMonths[8] = "Sep";

theMonths[9] = "Oct";

theMonths[10] = "Nov";

theMonths[11] = "Dec";

用关键字 Array 生成数组时,Jscript包含了length 属性,该属性记录了数组入口数。如果没有给该属性指定值,则设置长度为 0 且数组没有入口点。如果指定一个数值,则将长度设置为该数。如果指定了不止一个参数,则这些参数被用作数组的入口。另外,参数的数目被赋给 length 属性。如下面的示例与前一个示例是等价的。

var theMonths = new Array("Jan","Feb", "Mar", "Apr", "May","Jun",

"Jul", "Aug", "Sep","Oct", "Nov", "Dec");

当向用关键字 Array 生成的数组中添加元素时,Jscript 自动改变属性length 的值。Jscript 中的数组索引总是以 0 开始,而不是 1,所以属性 length通常比数组的最大索引大 1。

String对象

在Jscript 中,可以将字符串(和数)当作对象来处理。string对象 有一些内置方法,可以和自己的字符串一起使用。其中一个是substring方法,它返回字符串的一部分。该方法以两个数字作为参数。

aString = "0123456789";

var aChunk = aString.substring(4, 7);  // 将aChunk 设为 "456"。

var aNotherChunk = aString.substring(7, 4);  // 将aNotherChunk 设为 "456"。

// 使用上面生成数组的示例:

firstLetter = theMonths[5].substring(0,1);  // 将变量 firstLetter 设为“J”。

String 对象的另一个属性是 length 属性。本属性包含了字符串中的字符数(空字符串为 0)。它是一个数值,可以直接在计算中使用。

var howLong = "Hello World".length  // 设置变量 howLong 为 11。

Math 对象

Math 对象有许多预定义属性和方法。属性是特殊的数字。这些特殊的数字之一是 pi 值(近似 3.14159…)。这是Math.PI 属性,如下例所示。

// 声明一个半径变量并赋数值。

var circleArea = Math.PI * radius * radius;  // 注意 Math 和 PI 大写。

Math 对象的一个内置方法是乘幂方法(或pow),使用该方法求得指定数的幂次。下面的例子同时使用了pi 和乘幂。

// 本公式计算给定半径的球体的体积。

volume = (4/3)*(Math.PI*Math.pow(radius,3));

Date 对象

Date 对象可以被用来表示任意的日期和时间,获取当前系统日期以及计算两个日期的间隔。它拥有一些预定义的属性和方法。通常,Date 对象给出星期;月份,天数和年份;以及以小时,分钟和秒表示的时间。该信息是基于 1970 年1 月 1 日 00:00:00.000 GMT 开始的毫秒数,其中 GMT 是格林威治标准时间(首选术语是 UTC,或者“全球标准时间”,它引用的信号是由“世界时间标准”发布的)。Jscript可以处理 250,000 B.C. 到 255,000 A.D范围内的日期。

使用 new 运算符创建一个新的 Date 对象。下面的示例计算当年已过去的天数和今年剩下的天数。

/*

本示例使用前面定义的月份名称数组。

第一条语句以“Day Month Date 00:00:00 Year”格式

对 thisIsToday 变量赋值。

*/

var thisIsToday = new Date();

 

var toDay = new Date(); //获取今天的日期。

 

// 提取年,月,日。

var thisYear = toDay.getFullYear();

var thisMonth = theMonths[toDay.getMonth()];

var thisDay = thisMonth + " " + toDay.getDate() + ", " + thisYear;

Number 对象

除了 Math 对象中可用的特殊数值属性(例如PI)外,在 Microsoft Jscript 中, Number 对象有几个其他的数值属性。

属性

描述

MAX_VALUE

可能的最大数大约为 1.79E+308;可以是正数或负数。(具体数值随系统不同而有微小差别。)

MIN_VALUE

可能的最小数大约为 2.22E-308;可以是正数或负数。(具体数值随系统不同而有微小差别。)

NaN

特殊非数量值,“不是数值”。

POSITIVE_INFINITY

比最大正数(Number.MAX_VALUE)还要大的任意正值自动被转换为此值,代表正无穷大。

NEGATIVE_INFINITY

比最小的负数(负的 Number.MAX_VALUE)还小的任意值被自动转换为此值,代表负无穷。

 

Number.NaN 是一个特殊的属性,被定义为“不是数值”。例如被 0 除返回NaN。试图解析一个无法被解析为数字的字符串同样返回Number.NaN。把 NaN 与任何数值或本身作比较的结果都是不相等。不能通过与 Number.NaN 比较来测试 NaN 结果,而应该使用isNaN() 函数。

原创粉丝点击