# 數字與日期

## 數字(Numbers)

BigInt 是Javascript最新的功能，它可以表示一個很大的整數。使用 BigInt需要注意一點BigIntNumber不能在同一個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 (en-US) 可表示的最大數值
Number.MIN_VALUE (en-US) 可表示的最小數值
Number.NaN (en-US) 表示「非數值」（Not-A-Number）的數值
Number.NEGATIVE_INFINITY (en-US) Special negative infinite value; returned on overflow
Number.POSITIVE_INFINITY (en-US) Special positive infinite value; returned on overflow
Number.EPSILON (en-US) Difference between one and the smallest value greater than one that can be represented as a Number.
Number.MIN_SAFE_INTEGER (en-US) 可以在 JavaScript 中安全表示的最小數值。
Number.MAX_SAFE_INTEGER (en-US) 可以在 JavaScript 中安全表示的最大數值。
Number 的方法

Number.parseFloat() (en-US) 字串轉換成浮點數。

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

Number.isFinite() 判定給定的值是不是一個有限數。
Number.isInteger() (en-US) 判定給定的值是不是一個整數
Number.isNaN() Determines whether the passed value is NaN. More robust version of the original global isNaN().
Number.isSafeInteger() (en-US) 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() (en-US) 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() (en-US), cos() (en-US), tan() (en-US) 三角函數; 引數以弳度表示
asin() (en-US), acos() (en-US), atan() (en-US), atan2() (en-US) 反三角函數; 回傳值以弳度表示
sinh() (en-US), cosh() (en-US), tanh() (en-US) 雙曲函數; 引數以 hyperbolic angle 表示
asinh() (en-US), acosh() (en-US), atanh() (en-US) 反雙曲函數; 回傳值以 hyperbolic angle 表示

floor(), ceil() 回傳小於等於/大於等於指定數字的最大/最小整數
min() (en-US), max() Returns lesser or greater (respectively) of comma separated list of numbers arguments
random() 回傳一個介於 0 到 1 之間的數值
round(), fround() (en-US), trunc() (en-US), Rounding and truncation functions.
sqrt() (en-US), cbrt() (en-US), hypot() (en-US) Square root, cube root, Square root of the sum of square arguments.
sign() (en-US) The sign of a number, indicating whether the number is positive, negative or zero.
clz32() (en-US),
imul() (en-US)
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 這三個變數。