aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/javascript/guide/numbers_and_dates/index.html
blob: bab62dcd978344d2650ff574f4339e99638db5c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
---
title: 数字和日期
slug: Web/JavaScript/Guide/Numbers_and_dates
tags:
  - JavaScript
  - 指南
translation_of: Web/JavaScript/Guide/Numbers_and_dates
---
<div>{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Expressions_and_Operators", "Web/JavaScript/Guide/Text_formatting")}}</div>

<div>本章节介绍了在JavaScript中使用数字和日期来处理和执行计算的概念,对象和函数。</div>

<p>本章节介绍如何掌握Javascript里的数字和日期类型</p>

<h2 id="数字">数字</h2>

<p>在 JavaScript 里面,数字均为双精度浮点类型(<a href="https://en.wikipedia.org/wiki/Double-precision_floating-point_format">double-precision 64-bit binary format IEEE 754</a>),即一个介于±2<sup>−1023</sup>和±2<sup>+1024</sup>之间的数字,或约为±10<sup>−308</sup>到±10<sup>+308</sup>,数字精度为53位。整数数值仅在±(2<sup>53 -</sup> 1)的范围内可以表示准确。</p>

<p>除了能够表示浮点数,数字类型也还能表示三种符号值: <code>+</code>{{jsxref("Infinity")}}(正无穷)、<code>-</code>{{jsxref("Infinity")}}(负无穷)和 {{jsxref("NaN")}} (not-a-number,非数字)。</p>

<p>JavaScript最近添加了 {{jsxref("BigInt")}} 的支持,能够用于表示极大的数字。使用 BigInt 的时候有一些注意事项,例如,你不能让 BigInt 和 {{jsxref("Number")}} 直接进行运算,你也不能用 {{jsxref("Math")}} 对象去操作 BigInt 数字。</p>

<p>请参见Javascript指南中的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures">JavaScript 数据类型和数据结构</a> ,了解其他更多的基本类型。</p>

<p>您可以使用四种数字进制:十进制,二进制,八进制和十六进制。</p>

<h3 id="十进制数字Decimal_numbers">十进制数字(Decimal numbers)</h3>

<pre class="brush: js">1234567890
42
// 以零开头的数字的注意事项:
0888 // 888 将被当做十进制处理
0777 // 在非严格格式下会被当做八进制处理 (用十进制表示就是511)
</pre>

<p>请注意,十进制可以以0开头,后面接其他十进制数字,但是假如下一个接的十进制数字小于8,那么该数字将会被当做八进制处理。</p>

<h3 id="二进制数字Binary_numbers">二进制数字(Binary numbers)</h3>

<p>二进制数字语法是以零为开头,后面接一个小写或大写的拉丁文字母B(<code>0b或者是0B</code>)。 假如0b后面的数字不是0或者1,那么就会提示这样的语法错误( <code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError">SyntaxError</a>):</code> "Missing binary digits after 0b(0b之后缺失二有效的二进制数据)"。</p>

<pre class="brush: js">var FLT_SIGNBIT  = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607</pre>

<h3 id="八进制数字Octal_numbers">八进制数字(Octal numbers)</h3>

<p>八进制数字语法是以0为开头的。假如0后面的数字不在0到7的范围内,该数字将会被转换成十进制数字。</p>

<pre class="brush: js">var n = 0755; // 493
var m = 0644; // 420
</pre>

<p>在ECMAScript 5 严格模式下禁止使用八进制语法。八进制语法并不是ECMAScript 5规范的一部分,但是通过在八进制数字添加一个前缀0就可以被所有的浏览器支持:0644 === 420 而且 "\045" === "%"。在ECMAScript 6中使用八进制数字是需要给一个数字添加前缀"0o"。</p>

<pre class="brush: js">var a = 0o10; // ES6 :八进制</pre>

<h3 id="十六进制Hexadecimal_numbers">十六进制(Hexadecimal numbers)</h3>

<p>十六进制数字语法是以零为开头,后面接一个小写或大写的拉丁文字母X(<code>0x或者是0X</code>)。假如<code>0x</code>后面的数字超出规定范围(0123456789ABCDEF),那么就会提示这样的语法错误(<code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError">SyntaxError</a>):</code>"Identifier starts immediately after numeric literal".</p>

<pre class="brush: js">0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF   // 81985529216486900
0XA                 // 10
</pre>

<h3 id="指数形式Exponentiation">指数形式(Exponentiation)</h3>

<pre class="brush: js">1E3   // 1000
2e6   // 2000000
0.1e2 // 10
</pre>

<h2 id="数字对象"><code>数字对象</code></h2>

<p>内置的{{jsxref("Number")}}对象有一些有关数字的常量属性,如最大值、不是一个数字和无穷大的。你不能改变这些属性,但可以按下边的方式使用它们:</p>

<pre class="brush: js">var biggestNum = Number.MAX_VALUE;
var smallestNum = Number.MIN_VALUE;
var infiniteNum = Number.POSITIVE_INFINITY;
var negInfiniteNum = Number.NEGATIVE_INFINITY;
var notANum = Number.NaN;
</pre>

<p>你永远只用从Number对象引用上边显示的属性,而不是你自己创建的Number对象的属性。</p>

<p>下面的表格汇总了数字对象的属性:</p>

<p><strong>数字的属性</strong></p>

<table>
 <thead>
  <tr>
   <th scope="col">属性</th>
   <th scope="col">描述</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{jsxref("Number.MAX_VALUE")}}</td>
   <td>可表示的最大值</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.MIN_VALUE")}}</td>
   <td>可表示的最小值</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.NaN")}}</td>
   <td>特指”非数字“</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.NEGATIVE_INFINITY")}}</td>
   <td>特指“负无穷”;在溢出时返回</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.POSITIVE_INFINITY")}}</td>
   <td>特指“正无穷”;在溢出时返回</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.EPSILON")}}</td>
   <td>
    <p>表示1和比最接近1且大于1的最小{{jsxref("Number")}}之间的差别</p>
   </td>
  </tr>
  <tr>
   <td>{{jsxref("Number.MIN_SAFE_INTEGER")}}</td>
   <td>JavaScript最小安全整数.</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.MAX_SAFE_INTEGER")}}</td>
   <td>JavaScript最大安全整数.</td>
  </tr>
 </tbody>
</table>

<table>
 <caption>数字的方法</caption>
 <thead>
  <tr>
   <th>方法</th>
   <th>描述</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{jsxref("Number.parseFloat()")}}</td>
   <td>把字符串参数解析成浮点数,<br>
    和全局方法 {{jsxref("parseFloat", "parseFloat()")}} 作用一致.</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.parseInt()")}}</td>
   <td>
    <p>把字符串解析成特定基数对应的整型数字,和全局方法 {{jsxref("parseInt", "parseInt()")}} 作用一致.</p>
   </td>
  </tr>
  <tr>
   <td>{{jsxref("Number.isFinite()")}}</td>
   <td>判断传递的值是否为有限数字。</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.isInteger()")}}</td>
   <td>判断传递的值是否为整数。</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.isNaN()")}}</td>
   <td>判断传递的值是否为 {{jsxref("Global_Objects/NaN", "NaN")}}. More robust version of the original global {{jsxref("Global_Objects/isNaN", "isNaN()")}}.</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.isSafeInteger()")}}</td>
   <td>判断传递的值是否为安全整数。</td>
  </tr>
 </tbody>
</table>

<p>数字的类型提供了不同格式的方法以从数字对象中检索信息。以下表格总结了 <code>数字类型原型上的方法。</code></p>

<table>
 <caption>数字类型原型上的一些方法</caption>
 <thead>
  <tr>
   <th scope="col">方法</th>
   <th scope="col">描述</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{jsxref("Number.toExponential", "toExponential()")}}</td>
   <td>返回一个数字的指数形式的字符串,形如:1.23e+2</td>
  </tr>
  <tr>
   <td>{{jsxref("Number.toFixed", "toFixed()")}}</td>
   <td>
    <p>返回指定小数位数的表示形式,</p>

    <p>var a=123,b=a.toFixed(2)//b="123.00"</p>
   </td>
  </tr>
  <tr>
   <td>{{jsxref("Number.toPrecision", "toPrecision()")}}</td>
   <td>
    <p>返回一个指定精度的数字。如下例子中,a=123中,3会由于精度限制消失</p>

    <p>var a=123,b=a.toPrecision(2)//b="1.2e+2"</p>
   </td>
  </tr>
 </tbody>
</table>

<h2 id="数学对象(Math)">数学对象(Math)</h2>

<p>对于内置的{{jsxref("Math")}}数学常项和函数也有一些属性和方法。 比方说, <code>Math对象的</code> <code>PI</code> 属性会有属性值 pi (3.141...),你可以像这样调用它:</p>

<pre class="brush: js">Math.PI // π
</pre>

<p>同理,标准数学函数也是Math的方法。 这些包括三角函数​​,对数,指数,和其他函数。比方说你想使用三角函数 <code>sin</code>, 你可以这么写:</p>

<pre class="brush: js">Math.sin(1.56)
</pre>

<p>需要注意的是Math的所有三角函数参数都是弧度制。</p>

<p>下面的表格总结了 <code>Math</code> 对象的方法。</p>

<p>Math的方法</p>

<table>
 <thead>
  <tr>
   <th scope="col">方法</th>
   <th scope="col">描述</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{jsxref("Math.abs", "abs()")}}</td>
   <td>绝对值</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.sin", "sin()")}}, {{jsxref("Math.cos", "cos()")}}, {{jsxref("Math.tan", "tan()")}}</td>
   <td>标准三角函数;参数为弧度</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.asin", "asin()")}}, {{jsxref("Math.acos", "acos()")}}, {{jsxref("Math.atan", "atan()")}}, {{jsxref("Math.atan2", "atan2()")}}</td>
   <td>反三角函数; 返回值为弧度</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.sinh", "sinh()")}}, {{jsxref("Math.cosh", "cosh()")}}, {{jsxref("Math.tanh", "tanh()")}}</td>
   <td>双曲三角函数; 参数为弧度.</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.asinh", "asinh()")}}, {{jsxref("Math.acosh", "acosh()")}}, {{jsxref("Math.atanh", "atanh()")}}</td>
   <td>反双曲三角函数;返回值为弧度.</td>
  </tr>
  <tr>
   <td>
    <p>{{jsxref("Math.pow", "pow()")}}, {{jsxref("Math.exp", "exp()")}}{{jsxref("Math.expm1", "expm1()")}}, {{jsxref("Math.log10", "log10()")}}, {{jsxref("Math.log1p", "log1p()")}}, {{jsxref("Math.log2", "log2()")}}</p>
   </td>
   <td>指数与对数函数</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.floor", "floor()")}}, {{jsxref("Math.ceil", "ceil()")}}</td>
   <td>返回小于等于参数的最大整数;返回大于等于参数的最小整数</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.min", "min()")}}, {{jsxref("Math.max", "max()")}}</td>
   <td>
    <p>返回一个以逗号间隔的数字参数列表中的较小或较大值(分别地)</p>
   </td>
  </tr>
  <tr>
   <td>{{jsxref("Math.random", "random()")}}</td>
   <td>返回0和1之间的随机数。</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.round", "round()")}}, {{jsxref("Math.fround", "fround()")}}, {{jsxref("Math.trunc", "trunc()")}},</td>
   <td>四舍五入和截断函数</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.sqrt", "sqrt()")}}, {{jsxref("Math.cbrt", "cbrt()")}}, {{jsxref("Math.hypot", "hypot()")}}</td>
   <td>
    <p>平方根,立方根,所有参数平方和的平方根 </p>

    <p>两个参数平方和的平方根</p>
   </td>
  </tr>
  <tr>
   <td>{{jsxref("Math.sign", "sign()")}}</td>
   <td>数字的符号, 说明数字是否为正、负、零。</td>
  </tr>
  <tr>
   <td>{{jsxref("Math.clz32", "clz32()")}},<br>
    {{jsxref("Math.imul", "imul()")}}</td>
   <td>
    <p>在32位2进制表示中,开头的0的数量.</p>

    <p><em>返回传入的两个参数相乘结果的类C的32位表现形式</em></p>
   </td>
  </tr>
 </tbody>
</table>

<p>和其他对象不同,你不能够创建一个自己的Math对象。你只能使用内置的Math对象。</p>

<h2 id="日期对象">日期对象</h2>

<p>JavaScript没有日期数据类型。但是你可以在你的程序里使用 {{jsxref("Date")}} 对象和其方法来处理日期和时间。Date对象有大量的设置、获取和操作日期的方法。 它并不含有任何属性。</p>

<p>JavaScript 处理日期数据类似于Java。这两种语言有许多一样的处理日期的方法,也都是以1970年1月1日00:00:00以来的毫秒数来储存数据类型的。</p>

<p><code>Date</code> 对象的范围是相对距离 UTC 1970年1月1日 的前后 100,000,000 天。</p>

<p>创建一个日期对象:</p>

<pre class="brush: js">var dateObjectName = new Date([parameters]);
</pre>

<p>这里的 dateObjectName 对象是所创建的Date对象的一个名字,它可以成为一个新的对象或者已存在的其他对象的一个属性。</p>

<p>不使用 <em>new </em>关键字来调用Date对象将返回当前时间和日期的字符串</p>

<p>前边的语法中的参数(parameters)可以是一下任何一种:</p>

<ul>
 <li>无参数 : 创建今天的日期和时间,例如: <code>today = new Date();</code>.</li>
 <li>一个符合以下格式的表示日期的字符串: "月 日, 年 时:分:秒." 例如: <code>var Xmas95 = new Date("December 25, 1995 13:30:00")。</code>如果你省略时、分、秒,那么他们的值将被设置为0。</li>
 <li>一个年,月,日的整型值的集合,例如: <code>var Xmas95 = new Date(1995, 11, 25)。</code></li>
 <li>一个年,月,日,时,分,秒的集合,例如: <code>var Xmas95 = new Date(1995, 11, 25, 9, 30, 0);</code>.</li>
</ul>

<h3 id="Date对象的方法"><code>Date对象的方法</code></h3>

<p>处理日期时间的Date对象方法可分为以下几类:</p>

<ul>
 <li>"set" 方法, 用于设置Date对象的日期和时间的值。</li>
 <li>"get" 方法,用于获取Date对象的日期和时间的值。</li>
 <li>"to" 方法,用于返回Date对象的字符串格式的值。</li>
 <li>parse 和UTC 方法, 用于解析Date字符串。</li>
</ul>

<p>通过“get”和“set”方法,你可以分别设置和获取秒,分,时,日,星期,月份,年。这里有个getDay方法可以返回星期,但是没有相应的setDay方法用来设置星期,因为星期是自动设置的。这些方法用整数来代表以下这些值:</p>

<ul>
 <li>秒,分: 0 至 59</li>
 <li>时: 0 至 23</li>
 <li>星期: 0 (周日) 至 6 (周六)</li>
 <li>日期:1 至 31 </li>
 <li>月份: 0 (一月) to 11 (十二月)</li>
 <li>年份: 从1900开始的年数</li>
</ul>

<p>例如, 假设你定义了如下日期:</p>

<pre class="brush: js">var Xmas95 = new Date("December 25, 1995");
</pre>

<p>Then <code>Xmas95.getMonth()</code> 返回 11, and <code>Xmas95.getFullYear()</code> 返回 1995.</p>

<p><code>getTime</code> 和 <code>setTime</code> 方法对于比较日期是非常有用的。<code>getTime</code>方法返回从1970年1月1日00:00:00的毫秒数。</p>

<p>例如,以下代码展示了今年剩下的天数:</p>

<pre class="brush: js">var today = new Date();
var endYear = new Date(1995, 11, 31, 23, 59, 59, 999); // 设置日和月,注意,月份是0-11
endYear.setFullYear(today.getFullYear()); // 把年设置为今年
var msPerDay = 24 * 60 * 60 * 1000; // 每天的毫秒数
var daysLeft = (endYear.getTime() - today.getTime()) / msPerDay;
var daysLeft = Math.round(daysLeft); //返回今年剩下的天数
</pre>

<p>这个例子中,创建了一个包含今天的日期的<code>Date</code>对象,并命名为<code>today</code>,然后创建了一个名为<code>endYear</code><code>Date</code>对象,并把年份设置为当前年份,接着使用<code>today</code><code>endYear</code><code>getTime</code>分别获取今天和年底的毫秒数,再根据每一天的毫秒数,计算出了今天到年底的天数,最后四舍五入得到今年剩下的天数。</p>

<p>parse方法对于从日期字符串赋值给现有的Date对象很有用,例如:以下代码使用<code>parse</code><code>setTime</code>分配了一个日期值给<code>IPOdate</code>对象:</p>

<pre class="brush: js">var IPOdate = new Date();
IPOdate.setTime(Date.parse("Aug 9, 1995"));
</pre>

<h3 id="例子:">例子:</h3>

<p>在下边的例子中,JSClock()函数返回了用数字时钟格式的时间:</p>

<pre class="brush: js">function JSClock() {
  var time = new Date();
  var hour = time.getHours();
  var minute = time.getMinutes();
  var second = time.getSeconds();
  var temp = "" + ((hour &gt; 12) ? hour - 12 : hour);
  if (hour == 0)
    temp = "12";
  temp += ((minute &lt; 10) ? ":0" : ":") + minute;
  temp += ((second &lt; 10) ? ":0" : ":") + second;
  temp += (hour &gt;= 12) ? " P.M." : " A.M.";
  return temp;
}
</pre>

<p><code>JSClock</code>函数首先创建了一个叫做<code>time</code>的新的<code>Date</code>对象,因为没有参数,所以<code>time</code>代表了当前日期和时间。然后调用了<code>getHours</code><code>getMinutes</code>以及<code>getSeconds</code>方法把当前的时分秒分别赋值给了<code>hour</code><code>minute</code><code>second</code></p>

<p>接下来的4句在<code>time</code>的基础上创建了一个字符串,第一句创建了一个变量<code>temp</code>,并通过一个条件表达式进行了赋值,如果小时大于12,就为(<code>hour - 12</code>),其他情况就为<code>hour</code>,除非<code>hour</code>为0,这种情况下,它会变成12。</p>

<p>接下来的语句拼接了<code>minute</code>的值到<code>temp</code>后。如果<code>minute</code>小于10,条件表达式就会在<code>minute</code>前边加个0,其他情况下加一个冒号。然后按同样的方式在<code>temp</code>后拼接上了秒。</p>

<p>最后,如果<code>hour</code>是12或者更大,条件表达式会在<code>temp</code>后拼接"P.M.",否则拼接"A.M."。</p>

<p>{{PreviousNext("Web/JavaScript/Guide/Expressions_and_Operators", "Web/JavaScript/Guide/Text_formatting")}}</p>