# 數字與日期

## 數字(Numbers)

`BigInt` 是Javascript最新的功能，它可以表示一個很大的整數。使用 `BigInt需要注意一點``BigInt``Number`不能在同一個operation混用還有當用 `Math` 物件時不能使用`BigInt`

### 十進制數值

```1234567890
42

// 以零為開頭時要小心：

0888 // 888 解析為 十進制數值
0777 // 在 non-strict 模式下將解析成八進制 (等同於十進制的 511)
```

### 二進制數值

```var FLT_SIGNBIT  = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607```

### 八進制數值

```var n = 0755; // 493
var m = 0644; // 420
```

Strict mode in ECMAScript 5 forbids octal syntax. Octal syntax isn't part of ECMAScript 5, but it's supported in all browsers by prefixing the octal number with a zero: `0644 === 420` and`"\045" === "%"`. In ECMAScript 2015, octal numbers are supported if they are prefixed with `0o`, e.g.:

```var a = 0o10; // ES2015: 8
```

### 十六進制數值

```0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF   // 81985529216486900
0XA                 // 10
```

### 指數運算

```1E3   // 1000
2e6   // 2000000
0.1e2 // 10```

## `Number` 物件

The built-in `Number` object has properties for numerical constants, such as maximum value, not-a-number, and infinity. You cannot change the values of these properties and you use them as follows:

```var biggestNum = Number.MAX_VALUE;
var smallestNum = Number.MIN_VALUE;
var infiniteNum = Number.POSITIVE_INFINITY;
var negInfiniteNum = Number.NEGATIVE_INFINITY;
var notANum = Number.NaN;
```

You always refer to a property of the predefined `Number` object as shown above, and not as a property of a `Number` object you create yourself.

`Number` 的屬性

`Number.MAX_VALUE` 可表示的最大數值
`Number.MIN_VALUE` 可表示的最小數值
`Number.NaN` 表示「非數值」（Not-A-Number）的數值
`Number.NEGATIVE_INFINITY` Special negative infinite value; returned on overflow
`Number.POSITIVE_INFINITY` Special positive infinite value; returned on overflow
`Number.EPSILON` Difference between one and the smallest value greater than one that can be represented as a `Number`.
`Number.MIN_SAFE_INTEGER` 可以在 JavaScript 中安全表示的最小數值。
`Number.MAX_SAFE_INTEGER` 可以在 JavaScript 中安全表示的最大數值。
`Number` 的方法

`Number.parseFloat()` 字串轉換成浮點數。

`Number.parseInt()` 以指定的基數將字串轉換成整數。

`Number.isFinite()` 判定給定的值是不是一個有限數。
`Number.isInteger()` 判定給定的值是不是一個整數
`Number.isNaN()` Determines whether the passed value is `NaN`. More robust version of the original global `isNaN()`.
`Number.isSafeInteger()` Determines whether the provided value is a number that is a safe integer.

The `Number` prototype provides methods for retrieving information from `Number` objects in various formats. The following table summarizes the methods of `Number.prototype`.

`Number.prototype` 的方法

`toExponential()` Returns a string representing the number in exponential notation.
`toFixed()` Returns a string representing the number in fixed-point notation.
`toPrecision()` Returns a string representing the number to a specified precision in fixed-point notation.

## `Math` 物件

The built-in `Math` object has properties and methods for mathematical constants and functions. For example, the `Math` object's `PI` property has the value of pi (3.141...), which you would use in an application as

```Math.PI
```

Similarly, standard mathematical functions are methods of `Math`. These include trigonometric, logarithmic, exponential, and other functions. For example, if you want to use the trigonometric function sine, you would write

```Math.sin(1.56)
```

Note that all trigonometric methods of `Math` take arguments in radians.

The following table summarizes the `Math` object's methods.

`Math` 的方法

`abs()` 絕對值
`sin()`, `cos()`, `tan()` 三角函數; 引數以弳度表示
`asin()`, `acos()`, `atan()`, `atan2()` 反三角函數; 回傳值以弳度表示
`sinh()`, `cosh()`, `tanh()` 雙曲函數; 引數以 hyperbolic angle 表示
`asinh()`, `acosh()`, `atanh()` 反雙曲函數; 回傳值以 hyperbolic angle 表示

`floor()`, `ceil()` 回傳小於等於/大於等於指定數字的最大/最小整數
`min()`, `max()` Returns lesser or greater (respectively) of comma separated list of numbers arguments
`random()` 回傳一個介於 0 到 1 之間的數值
`round()`, `fround()`, `trunc()`, Rounding and truncation functions.
`sqrt()`, `cbrt()`, `hypot()` Square root, cube root, Square root of the sum of square arguments.
`sign()` The sign of a number, indicating whether the number is positive, negative or zero.
`clz32()`,
`imul()`
Number of leading zero bits in the 32-bit binary representation.
The result of the C-like 32-bit multiplication of the two arguments.

Unlike many other objects, you never create a `Math` object of your own. You always use the built-in `Math` object.

## `Date` 物件

JavaScript 沒有所謂日期(date)的數據型態(data type)。你可以使用 `Date` 物件及其方法去設定日期跟時間來滿足你的需求 。`Date` 物件有大量的設定取得操作日期的方法(method)，但它沒有屬性。

JavaScript 處理日期的方式跟Java類似。這兩個語言有許多一樣的date方法，且都將日期儲存為從1970年1月1號0時0分0秒以來的毫秒數(millisecond)。

`Date` 物件範圍是 -100,000,000 days to 100,000,000 days 以1970年1月1號0時0分0秒UTC為基準。

```var dateObjectName = new Date([parameters]);
```

Calling `Date` without the `new` keyword returns a string representing the current date and time.

The `parameters` in the preceding syntax can be any of the following:

• Nothing: creates today's date and time. For example, `today = new Date();`.
• A string representing a date in the following form: "Month day, year hours:minutes:seconds." For example, `var Xmas95 = new Date("December 25, 1995 13:30:00")`. If you omit hours, minutes, or seconds, the value will be set to zero.
• A set of integer values for year, month, and day. For example, `var Xmas95 = new Date(1995, 11, 25)`.
• A set of integer values for year, month, day, hour, minute, and seconds. For example, `var Xmas95 = new Date(1995, 11, 25, 9, 30, 0);`.

### `Date` 的方法

The `Date` object methods for handling dates and times fall into these broad categories:

• "set" methods, for setting date and time values in `Date` objects.
• "get" methods, for getting date and time values from `Date` objects.
• "to" methods, for returning string values from `Date` objects.
• parse and UTC methods, for parsing `Date` strings.

With the "get" and "set" methods you can get and set seconds, minutes, hours, day of the month, day of the week, months, and years separately. There is a `getDay` method that returns the day of the week, but no corresponding `setDay` method, because the day of the week is set automatically. These methods use integers to represent these values as follows:

• Seconds and minutes: 0 到 59
• Hours: 0 到 23
• Day: 0 (星期日) 到 6 (星期六)
• Date: 1 到 31 (這個月的第幾天)
• Months: 0 (一月) 到 11 (十二月)
• Year: years since 1900

```var Xmas95 = new Date('December 25, 1995');
```

`getTime` 及 `setTime` 這兩個方法對於比較日期有幫助。 The `getTime` method returns the number of milliseconds since January 1, 1970, 00:00:00 for a `Date` object.

For example, the following code displays the number of days left in the current year:

```var today = new Date();
var endYear = new Date(1995, 11, 31, 23, 59, 59, 999); // Set day and month
endYear.setFullYear(today.getFullYear()); // Set year to this year
var msPerDay = 24 * 60 * 60 * 1000; // Number of milliseconds per day
var daysLeft = (endYear.getTime() - today.getTime()) / msPerDay;
var daysLeft = Math.round(daysLeft); //returns days left in the year
```

This example creates a `Date` object named `today` that contains today's date. It then creates a `Date` object named `endYear` and sets the year to the current year. Then, using the number of milliseconds per day, it computes the number of days between `today` and `endYear`, using `getTime` and rounding to a whole number of days.

The `parse` method is useful for assigning values from date strings to existing `Date` objects. For example, the following code uses `parse` and `setTime` to assign a date value to the `IPOdate` object:

```var IPOdate = new Date();
IPOdate.setTime(Date.parse('Aug 9, 1995'));
```

### 範例

```function JSClock() {
var time = new Date();
var hour = time.getHours();
var minute = time.getMinutes();
var second = time.getSeconds();
var temp = '' + ((hour > 12) ? hour - 12 : hour);
if (hour == 0)
temp = '12';
temp += ((minute < 10) ? ':0' : ':') + minute;
temp += ((second < 10) ? ':0' : ':') + second;
temp += (hour >= 12) ? ' P.M.' : ' A.M.';
return temp;
}
```

`JSClock` 這個函式會先建立一個名為 `time` 的 `Date` 物件; 因為沒有提供任何引數，所以會放入目前的日期及時間。接著呼叫 `getHours` 、 `getMinutes` 以及 `getSeconds` 這三個方法將現在的時、分以及秒分別指定給 `hour` 、 `minute` 以及 `second` 這三個變數。