第 五 部 分:预 定 义 对 象

时 间 对 象

JavaScript 让 你 使 用 一 些 预 定 义 对 象, 象 日 期 对 象, 数 组 对 象 和 数 学 对 象。 还 有 其 他 的 对 象, 请 从 Netscape 的 文 档 中 获 得 详 细 的 说 明。
我 们 先 来 看 看 日 期 对 象。 就 象 它 的 名 字 所 写 的, 它 与 时 间 和 日 期 有 关。 举 例 来 说, 通 过 它 你 能 轻 而 易 举 的 计 算 出 离 下 次 过 年 还 有 多 少 时 间, 或 者 在 你 的 HTML 文 本 中 加 入 准 确 的 时 间。
先 来 看 一 个 显 示 准 确 时 间 的 例 子。 我 们 先 要 用 new 生 成 一 个 时 间 对 象。 看 下 面 的 代 码:

today= new Date()

这 儿 生 成 了 一 个 叫 today 的 时 间 对 象。 如 果 你 没 有 在 生 成 一 个 新 的 时 间 对 象 时 指 定 一 个 日 期 或 时 间, 那 么 将 使 用 当 前 的 日 期 和 时 间。 这 就 是 说, 当 执 行 了 today= new Date() 后, 那 个 新 的 时 间 对 象 today 返 回 的 是 当 前 的 日 期 和 时 间。
时 间 对 象 有 一 些 不 同 的 方 法, 在 这 儿 我 们 可 以 和 today 对 象 一 起 使 用。 象 getHours(), setHours(), getMinutes(), setMinutes(), getMonth(), setMonth() 等。 你 可 以 在 Netscape Javascript 的 文 档 中 找 到 对 于 时 间 对 象 和 它 的 方 法 的 完 整 的 介 绍。
请 记 住 时 间 对 象 只 返 回 一 个 特 定 的 日 期 和 时 间。 它 不 象 一 个 时 钟, 会 自 动 的 更 新 每 一 秒 或 毫 秒。
为 了 得 到 另 一 个 日 期 和 时 间, 我 们 需 要 使 用 另 一 个 构 造 程 序( 这 是 在 构 造 新 的 时 间 对 象 时 调 用 Date() 方 法 实 现 的):

today= new Date(1997, 0, 1, 17, 35, 23)

这 会 产 生 一 个 返 回 了1997 年1 月1 日17:35 分23 秒 的 时 间 对 象。 所 以 你 可 以 通 过 下 面 的 方 法 设 定 日 期 和 时 间:

Date( 年, 月, 日, 小 时, 分, 秒)

请 记 住 要 用 0 来 代 表1 月, 而 不 是1。1 代 表2 月, 余 者 类 推。

现 在 我 们 可 以 写 一 段 代 码 来 输 出 准 确 的 日 期 和 时 间。 结 果 是 这 样 的:

代 码 是 这 样 的:

<script language="JavaScript">
<!-- hide

now= new Date();

document.write("Time: " + now.getHours() + ":" + now.getMinutes() + "<br>");
document.write("Date: " + (now.getMonth() + 1) + "/" + now.getDate() + "/" + 
                (1900 + now.getYear()));

// -->
</script>

在这里我们用方法 getHours() 来显示在日期对象now中制定的时间。你可以看到我们在年份上加了1900, 这是因为方法getYear()中返回的是自1900年开始以后的年份,着也就是说1997年返回的是97,2010年返回的是110, 不是10。如果我们加上1900,那我们就不会遇上2000年问题了。再次提醒在getMonth()中返回的数字要加一。
在这段代码中对数字是否小于10并不作判断,这也就是说也许时间会看起来像这样:14:3 这只是代表着当前时间是:14:03。下面的这段代码解决了这个问题。

现在我们来看一段显示了一个工作着的时钟的代码:

Time:
Date:

这儿是源代码:

<html>
<head>

<script Language="JavaScript">
<!-- hide

var timeStr, dateStr;

function clock() {
        now= new Date();

        // time 
        hours= now.getHours();
        minutes= now.getMinutes();
        seconds= now.getSeconds();
        timeStr= "" + hours;
        timeStr+= ((minutes < 10) ? ":0" : ":") + minutes;
        timeStr+= ((seconds < 10) ? ":0" : ":") + seconds;
        document.clock.time.value = timeStr;

        // date
        date= now.getDate();
        month= now.getMonth()+1;
        year= now.getYear();
        dateStr= "" + month;
        dateStr+= ((date < 10) ? "/0" : "/") + date;
        dateStr+= "/" + year;
        document.clock.date.value = dateStr;

        Timer= setTimeout("clock()",1000);
}

// -->
</script>
</head>

<body onLoad="clock()">

<form name="clock">
  Time:
  <input type="text" name="time" size="8"  value=""><br>
  Date:
  <input type="text" name="date" size="8" value="">
</form>

</body>
</html>

我们使用了setTimeout()方法每一秒来设定日期和时间。所以我们按照真实时间的每一秒来生成一个新的日期对象。
你可以看到函数clock()在 <body>标记符中被 onLoad 时间处理器调用。在我们的HTML页中有两个文本元素。 函数clock()在右边的表元素中写入了日期和时间,为此使用了两个字符串 timeStr和dateStr。 前面我们提到当分钟数少于10的时候会产生问题,这段代码解决了这个问题:

timeStr+= ((minutes < 10) ? ":0" : ":") + minutes;

这儿分钟数被加到了字符串 timeStr上。如果分钟数少于10我们加0。这段代码也许看起来有些怪。 这样写好懂一些:

if (minutes < 10) timeStr+= ":0" + minutes
  else timeStr+= ":" + minutes;

数组对象

数组是非常重要的。只要想一想你如何来储存100个不同的名字呢? 我们如何用Javascript来实现它呢?当然你可以定义100个变量然后赋以它们不同的值。 这非常复杂。
数组可以看作是许多变量的集合。你可以通过一个名字和一个数字来访问它们。 我们可以假定一个数组 names。我们可以通过用 names[0]来访问它第一个元素。 用 names[1]来访问它第二个元素,等等。
在JavaScript 1.1 (Netscape Navigator 3.0)以上版本你可以使用数组对象。 你可以用 myArray= new Array()来生成一个新的数组。现在你可以给这个数组幅值:

myArray[0]= 17;
myArray[1]= "Stefan";
myArray[2]= "Koch";

JavaScript得数组是非常灵活的。你不必担心它的大小,它的大小是没有限制的。如果你写了 myArray[99]= "xyz"那么这个数组的长度就是100个元素(一个JavaScript数组可以扩大但不能收缩。 所以尽量使用小数组)。
你可以在数组中储存数字,字符串或其他的对象。我在这儿并不想对数组的每一个细节都进行讨论,但我想通过 我的介绍能使你知道数组是一个很重要的概念。
为了得到更清晰的概念,来看一看下面的这个例子。下面的例子的输出是:

first element
second element
third element

这儿是源代码:

<script language="JavaScript">
<!-- hide

myArray= new Array();

myArray[0]= "first element";
myArray[1]= "second element";
myArray[2]= "third element";

for (var i= 0; i< 3; i++) {
  document.write(myArray[i] + "<br>");
}

// -->
</script>

我们先生成一个新的数组 myArray。然后我们给她赋三个不同的值。接着我们开始一个循环。 这个循环运行这个命令document.write(myArray[i] + "<br>");三次。变量 i 作为计数器,从0到2计数。你可以看到我们在循环中使用 myArray[i],因为 i从0到 2计数所以我们得到三个 document.write()调用。我们能这样改写这个循环:

document.write(myArray[0] + "<br>");
document.write(myArray[1] + "<br>");
document.write(myArray[2] + "<br>");

数组和JavaScript 1.0

因为 JavaScript 1.0 (Netscape Navigator 2.x and Microsoft Internet Explorer 3.x)并不支持数组对象,所以我们也应该考虑另一种写法。这段代码 可以再Netscape文档中找到:

function initArray() {
  this.length = initArray.arguments.length
  for (var i = 0; i < this.length; i++)   
    this[i+1] = initArray.arguments[i]
}

现在你可以这样生成一个数组:

myArray= new initArray(17, 3, 5);

括号中的数字是数组初始化时定义的值(这也可以用 JavaScript 1.1的数组对象实现)。请记住 这种数组并不能实现 JavaScript 1.1中数组对象的所有功能(象sort()方法可以按你的定义对数组元素进行排序)。

数学对象和随机数

如果你想进行数学计算那你会发现数学对象的一些方法会对你很有用。举例来说sin方法 sin()。 你会在Netscape的文档中发现完整的介绍。
我来示范使用random()方法来产生一个随机数。如果你使用 Math.random() 它会返回一个在0到1之间的随机数。这儿是 document.write(Math.random())的输出 (如果你重载入这个页的话这个数字会改变):