20 Numbers and Dates
20.1 Number Objects
20.1.1 The Number Constructor
The Number constructor is the Number property of the global object. When called as a constructor, it creates and initializes a new Number object. When Number is called as a function rather than as a constructor, it performs a type conversion.
The Number constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Number behaviour must include a super call to the Number constructor to create and initialize the subclass instance with a [[NumberData]] internal slot.
20.1.1.1 Number ( [ value ] )
When Number is called with argument number, the following steps are taken:
- If no arguments were passed to this function invocation, let n be +0.
- Else, let n be
ToNumber (value). ReturnIfAbrupt (n).- If NewTarget is
undefined , return n. - Let O be
OrdinaryCreateFromConstructor (NewTarget,"%NumberPrototype%", «[[NumberData]]» ). ReturnIfAbrupt (O).- Set the value of O's [[NumberData]] internal slot to n.
- Return O.
20.1.2 Properties of the Number Constructor
The value of the [[Prototype]] internal slot of the Number constructor is the intrinsic object
Besides the length property (whose value is 1), the Number constructor has the following properties:
20.1.2.1 Number.EPSILON
The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1 that is representable as a Number value, which is approximately 2.2204460492503130808472633361816 x 10-16.
This property has the attributes { [[Writable]]:
20.1.2.2 Number.isFinite ( number )
When the Number.isFinite is called with one argument number, the following steps are taken:
- If
Type (number) is not Number, returnfalse . - If number is
NaN ,+∞ , or-∞ , returnfalse . - Otherwise, return
true .
20.1.2.3 Number.isInteger ( number )
20.1.2.4 Number.isNaN ( number )
When the Number.isNaN is called with one argument number, the following steps are taken:
- If
Type (number) is not Number, returnfalse . - If number is
NaN , returntrue . - Otherwise, return
false .
This function differs from the global isNaN function (
20.1.2.5 Number.isSafeInteger ( number )
When the Number.isSafeInteger is called with one argument number, the following steps are taken:
20.1.2.6 Number.MAX_SAFE_INTEGER
The value of Number.MAX_SAFE_INTEGER is the largest integer n such that n and n + 1 are both exactly representable as a Number value.
The value of Number.MAX_SAFE_INTEGER is 9007199254740991 (253-1).
This property has the attributes { [[Writable]]:
20.1.2.7 Number.MAX_VALUE
The value of Number.MAX_VALUE is the largest positive finite value of the Number type, which is approximately
This property has the attributes { [[Writable]]:
20.1.2.8 Number.MIN_SAFE_INTEGER
The value of Number.MIN_SAFE_INTEGER is the smallest integer n such that n and n - 1 are both exactly representable as a Number value.
The value of Number.MIN_SAFE_INTEGER is -9007199254740991 (-(253-1)).
This property has the attributes { [[Writable]]:
20.1.2.9 Number.MIN_VALUE
The value of Number.MIN_VALUE is the smallest positive value of the Number type, which is approximately
In the IEEE 754-2008 double precision binary representation, the smallest possible value is a denormalized number. If an implementation does not support denormalized values, the value of Number.MIN_VALUE must be the smallest non-zero positive value that can actually be represented by the implementation.
This property has the attributes { [[Writable]]:
20.1.2.10 Number.NaN
The value of Number.NaN is
This property has the attributes { [[Writable]]:
20.1.2.11 Number.NEGATIVE_INFINITY
The value of Number.NEGATIVE_INFINITY is
This property has the attributes { [[Writable]]:
20.1.2.12 Number.parseFloat ( string )
The value of the Number.parseFloat data property is the same built-in function object that is the value of the parseFloat property of the global object defined in
20.1.2.13 Number.parseInt ( string, radix )
The value of the Number.parseInt data property is the same built-in function object that is the value of the parseInt property of the global object defined in
20.1.2.14 Number.POSITIVE_INFINITY
The value of Number.POSITIVE_INFINITY is
This property has the attributes { [[Writable]]:
20.1.2.15 Number.prototype
The initial value of Number.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
20.1.3 Properties of the Number Prototype Object
The Number prototype object is the intrinsic object
The value of the [[Prototype]] internal slot of the Number prototype object is the intrinsic object
Unless explicitly stated otherwise, the methods of the Number prototype object defined below are not generic and the
The abstract operation
The phrase “this Number value” within the specification of a method refers to the result returned by calling the abstract operation thisNumberValue with the
20.1.3.1 Number.prototype.constructor
The initial value of Number.prototype.constructor is the intrinsic object
20.1.3.2 Number.prototype.toExponential ( fractionDigits )
Return a String containing this Number value represented in decimal exponential notation with one digit before the significand's decimal point and fractionDigits digits after the significand's decimal point. If fractionDigits is
- Let x be thisNumberValue(
this value). ReturnIfAbrupt (x).- Let f be
ToInteger (fractionDigits). - Assert: f is 0, when fractionDigits is
undefined . ReturnIfAbrupt (f).- If x is
NaN , return the String"NaN". - Let s be the empty String.
- If x < 0, then
- Let s be
"-". - Let x = -x.
- Let s be
- If x =
+∞ , then- Return the concatenation of the Strings s and
"Infinity".
- Return the concatenation of the Strings s and
- If f < 0 or f > 20, throw a
RangeError exception. However, an implementation is permitted to extend the behaviour oftoExponentialfor values of f less than 0 or greater than 20. In this casetoExponentialwould not necessarily throwRangeError for such values. - If x = 0, then
- Let m be the String consisting of f+1 occurrences of the code unit 0x0030.
- Let e = 0.
- Else x ≠ 0,
- If fractionDigits is not
undefined , then- Let e and n be integers such that 10f ≤ n < 10f+1 and for which the exact mathematical value of n × 10e-f - x is as close to zero as possible. If there are two such sets of e and n, pick the e and n for which n × 10e-f is larger.
- Else fractionDigits is
undefined ,- Let e, n, and f be integers such that f ≥ 0, 10f ≤ n < 10f+1, the Number value for n × 10e-f is x, and f is as small as possible. Note that the decimal representation of n has f+1 digits, n is not divisible by 10, and the least significant digit of n is not necessarily uniquely determined by these criteria.
- Let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes).
- If fractionDigits is not
- If f ≠ 0, then
- Let a be the first element of m, and let b be the remaining f elements of m.
- Let m be the concatenation of the three Strings a,
".", and b.
- If e = 0, then
- Let c =
"+". - Let d =
"0".
- Let c =
- Else
- If e > 0, let c =
"+". - Else e ≤ 0,
- Let c =
"-". - Let e = -e.
- Let c =
- Let d be the String consisting of the digits of the decimal representation of e (in order, with no leading zeroes).
- If e > 0, let c =
- Let m be the concatenation of the four Strings m,
"e", c, and d. - Return the concatenation of the Strings s and m.
The length property of the toExponential method is 1.
If the toExponential method is called with more than one argument, then the behaviour is undefined (see clause
For implementations that provide more accurate conversions than required by the rules above, it is recommended that the following alternative version of step 12.b.i be used as a guideline:
- Let e, n, and f be integers such that f ≥ 0, 10f ≤ n < 10f+1, the Number value for n × 10e-f is x, and f is as small as possible. If there are multiple possibilities for n, choose the value of n for which n × 10e-f is closest in value to x. If there are two such possible values of n, choose the one that is even.
20.1.3.3 Number.prototype.toFixed ( fractionDigits )
toFixed returns a String containing this Number value represented in decimal fixed-point notation with fractionDigits digits after the decimal point. If fractionDigits is
The following steps are performed:
- Let x be thisNumberValue(
this value). ReturnIfAbrupt (x).- Let f be
ToInteger (fractionDigits). (If fractionDigits isundefined , this step produces the value0). ReturnIfAbrupt (f).- If f < 0 or f > 20, throw a
RangeError exception. However, an implementation is permitted to extend the behaviour oftoFixedfor values of f less than 0 or greater than 20. In this casetoFixedwould not necessarily throwRangeError for such values. - If x is
NaN , return the String"NaN". - Let s be the empty String.
- If x < 0, then
- Let s be
"-". - Let x = -x.
- Let s be
- If x ≥ 1021, then
- Let m =
ToString (x).
- Let m =
- Else x < 1021,
- Let n be an integer for which the exact mathematical value of n ÷ 10f - x is as close to zero as possible. If there are two such n, pick the larger n.
- If n = 0, let m be the String
"0". Otherwise, let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes). - If f ≠ 0, then
- Let k be the number of elements in m.
- If k ≤ f, then
- Let z be the String consisting of f+1-k occurrences of the code unit 0x0030.
- Let m be the concatenation of Strings z and m.
- Let k = f + 1.
- Let a be the first k-f elements of m, and let b be the remaining f elements of m.
- Let m be the concatenation of the three Strings a,
".", and b.
- Return the concatenation of the Strings s and m.
The length property of the toFixed method is 1.
If the toFixed method is called with more than one argument, then the behaviour is undefined (see clause
The output of toFixed may be more precise than toString for some values because toString only prints enough significant digits to distinguish the number from adjacent number values. For example,
(1000000000000000128).toString() returns "1000000000000000100", while
(1000000000000000128).toFixed(0) returns "1000000000000000128".
20.1.3.4 Number.prototype.toLocaleString( [ reserved1 [ , reserved2 ] ])
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Number.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleString method is used.
Produces a String value that represents this Number value formatted according to the conventions of the host environment's current locale. This function is implementation-dependent, and it is permissible, but not encouraged, for it to return the same thing as toString.
The meanings of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The length property of the toLocaleString method is 0.
20.1.3.5 Number.prototype.toPrecision ( precision )
Return a String containing this Number value represented either in decimal exponential notation with one digit before the significand's decimal point and
- Let x be thisNumberValue(
this value). ReturnIfAbrupt (x).- If precision is
undefined , returnToString (x). - Let p be
ToInteger (precision). ReturnIfAbrupt (p).- If x is
NaN , return the String"NaN". - Let s be the empty String.
- If x < 0, then
- Let s be code unit 0x002D (HYPHEN-MINUS).
- Let x = -x.
- If x =
+∞ , then- Return the String that is the concatenation of s and
"Infinity".
- Return the String that is the concatenation of s and
- If p < 1 or p > 21, throw a
RangeError exception. However, an implementation is permitted to extend the behaviour oftoPrecisionfor values of p less than 1 or greater than 21. In this casetoPrecisionwould not necessarily throwRangeError for such values. - If x = 0, then
- Let m be the String consisting of p occurrences of the code unit 0x0030 (DIGIT ZERO).
- Let e = 0.
- Else x ≠ 0,
- Let e and n be integers such that 10p-1 ≤ n < 10p and for which the exact mathematical value of n × 10e-p+1 - x is as close to zero as possible. If there are two such sets of e and n, pick the e and n for which n × 10e-p+1 is larger.
- Let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes).
- If e < -6 or e ≥ p, then
- Assert: e ≠ 0
- Let a be the first element of m, and let b be the remaining p-1 elements of m.
- Let m be the concatenation of a, code unit 0x002E (FULL STOP), and b.
- If e > 0, then
- Let c be code unit 0x002B (PLUS SIGN).
- Else e < 0,
- Let c be code unit 0x002D (HYPHEN-MINUS).
- Let e = -e.
- Let d be the String consisting of the digits of the decimal representation of e (in order, with no leading zeroes).
- Return the concatenation of s, m, code unit 0x0065 (LATIN SMALL LETTER E), c, and d.
- If e = p-1, return the concatenation of the Strings s and m.
- If e ≥ 0, then
- Let m be the concatenation of the first e+1 elements of m, the code unit 0x002E (FULL STOP), and the remaining p- (e+1) elements of m.
- Else e < 0,
- Let m be the String formed by the concatenation of code unit 0x0030 (DIGIT ZERO), code unit 0x002E (FULL STOP), -(e+1) occurrences of code unit 0x0030 (DIGIT ZERO), and the String m.
- Return the String that is the concatenation of s and m.
The length property of the toPrecision method is 1.
If the toPrecision method is called with more than one argument, then the behaviour is undefined (see clause
20.1.3.6 Number.prototype.toString ( [ radix ] )
The optional radix should be an integer value in the inclusive range 2 to 36. If radix not present or is
The following steps are performed:
- Let x be thisNumberValue(
this value). ReturnIfAbrupt (x).- If radix is not present, let radixNumber be 10.
- Else if radix is
undefined , let radixNumber be 10. - Else let radixNumber be
ToInteger (radix). ReturnIfAbrupt (radixNumber).- If radixNumber < 2 or radixNumber > 36, throw a
RangeError exception. - If radixNumber = 10, return
ToString (x). - Return the String representation of this Number value using the radix specified by radixNumber. Letters
a-zare used for digits with values 10 through 35. The precise algorithm is implementation-dependent, however the algorithm should be a generalization of that specified in7.1.12.1 .
The toString function is not generic; it throws a
20.1.3.7 Number.prototype.valueOf ( )
- Let x be thisNumberValue(
this value). - Return x.
20.1.4 Properties of Number Instances
Number instances are ordinary objects that inherit properties from the Number prototype object. Number instances also have a [[NumberData]] internal slot. The [[NumberData]] internal slot is the Number value represented by this Number object.
20.2 The Math Object
The Math object is the Math property of the global object. The Math object is a single ordinary object.
The value of the [[Prototype]] internal slot of the Math object is the intrinsic object
The Math object is not a function object. It does not have a [[Construct]] internal method; it is not possible to use the Math object as a constructor with the new operator. The Math object also does not have a [[Call]] internal method; it is not possible to invoke the Math object as a function.
In this specification, the phrase “the Number value for x” has a technical meaning defined in
20.2.1 Value Properties of the Math Object
20.2.1.1 Math.E
The Number value for e, the base of the natural logarithms, which is approximately 2.7182818284590452354.
This property has the attributes { [[Writable]]:
20.2.1.2 Math.LN10
The Number value for the natural logarithm of 10, which is approximately 2.302585092994046.
This property has the attributes { [[Writable]]:
20.2.1.3 Math.LN2
The Number value for the natural logarithm of 2, which is approximately 0.6931471805599453.
This property has the attributes { [[Writable]]:
20.2.1.4 Math.LOG10E
The Number value for the base-10 logarithm of e, the base of the natural logarithms; this value is approximately 0.4342944819032518.
This property has the attributes { [[Writable]]:
The value of Math.LOG10E is approximately the reciprocal of the value of Math.LN10.
20.2.1.5 Math.LOG2E
The Number value for the base-2 logarithm of e, the base of the natural logarithms; this value is approximately 1.4426950408889634.
This property has the attributes { [[Writable]]:
The value of Math.LOG2E is approximately the reciprocal of the value of Math.LN2.
20.2.1.6 Math.PI
The Number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.
This property has the attributes { [[Writable]]:
20.2.1.7 Math.SQRT1_2
The Number value for the square root of ½, which is approximately 0.7071067811865476.
This property has the attributes { [[Writable]]:
The value of Math.SQRT1_2 is approximately the reciprocal of the value of Math.SQRT2.
20.2.1.8 Math.SQRT2
The Number value for the square root of 2, which is approximately 1.4142135623730951.
This property has the attributes { [[Writable]]:
20.2.1.9 Math [ @@toStringTag ]
The initial value of the @@toStringTag property is the String value "Math".
This property has the attributes { [[Writable]]:
20.2.2 Function Properties of the Math Object
Each of the following Math object functions applies the
In the function descriptions below, the symbols NaN, -0, +0,
The behaviour of the functions acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log,log1p, log2, log10, pow, random, sin, sinh, sqrt, tan, and tanh is not precisely specified here except to require specific results for certain argument values that represent boundary cases of interest. For other argument values, these functions are intended to compute approximations to the results of familiar mathematical functions, but some latitude is allowed in the choice of approximation algorithms. The general intent is that an implementer should be able to use the same mathematical library for ECMAScript on a given hardware platform that is available to C programmers on that platform.
Although the choice of algorithms is left to the implementation, it is recommended (but not specified by this standard) that implementations use the approximation algorithms for IEEE 754-2008 arithmetic contained in fdlibm, the freely distributable mathematical library from Sun Microsystems (http://www.netlib.org/fdlibm).
20.2.2.1 Math.abs ( x )
Returns the absolute value of x; the result has the same magnitude as x but has positive sign.
- If x is NaN, the result is NaN.
- If x is -0, the result is +0.
-
If x is
-∞ , the result is+∞ .
20.2.2.2 Math.acos ( x )
Returns an implementation-dependent approximation to the arc cosine of x. The result is expressed in radians and ranges from
- If x is NaN, the result is NaN.
- If x is greater than 1, the result is NaN.
- If x is less than -1, the result is NaN.
- If x is exactly 1, the result is +0.
20.2.2.3 Math.acosh( x )
Returns an implementation-dependent approximation to the inverse hyperbolic cosine of x.
- If x is NaN, the result is NaN.
- If x is less than 1, the result is NaN.
- If x is 1, the result is +0.
-
If x is
+∞ , the result is+∞ .
20.2.2.4 Math.asin ( x )
Returns an implementation-dependent approximation to the arc sine of x. The result is expressed in radians and ranges from -π/2 to +π/2.
- If x is NaN, the result is NaN.
- If x is greater than 1, the result is NaN.
- If x is less than -1, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
20.2.2.5 Math.asinh( x )
Returns an implementation-dependent approximation to the inverse hyperbolic sine of x.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ .
20.2.2.6 Math.atan ( x )
Returns an implementation-dependent approximation to the arc tangent of x. The result is expressed in radians and ranges from -π/2 to +π/2.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is an implementation-dependent approximation to +π/2. -
If x is
-∞ , the result is an implementation-dependent approximation to -π/2.
20.2.2.7 Math.atanh( x )
Returns an implementation-dependent approximation to the inverse hyperbolic tangent of x.
- If x is NaN, the result is NaN.
- If x is less than -1, the result is NaN.
- If x is greater than 1, the result is NaN.
-
If x is -1, the result is
-∞ . -
If x is +1, the result is
+∞ . - If x is +0, the result is +0.
- If x is -0, the result is -0.
20.2.2.8 Math.atan2 ( y, x )
Returns an implementation-dependent approximation to the arc tangent of the quotient
- If either x or y is NaN, the result is NaN.
- If y>0 and x is +0, the result is an implementation-dependent approximation to +π/2.
- If y>0 and x is -0, the result is an implementation-dependent approximation to +π/2.
- If y is +0 and x>0, the result is +0.
- If y is +0 and x is +0, the result is +0.
- If y is +0 and x is -0, the result is an implementation-dependent approximation to +π.
- If y is +0 and x<0, the result is an implementation-dependent approximation to +π.
- If y is -0 and x>0, the result is -0.
- If y is -0 and x is +0, the result is -0.
- If y is -0 and x is -0, the result is an implementation-dependent approximation to -π.
- If y is -0 and x<0, the result is an implementation-dependent approximation to -π.
- If y<0 and x is +0, the result is an implementation-dependent approximation to -π/2.
- If y<0 and x is -0, the result is an implementation-dependent approximation to -π/2.
-
If y>0 and y is finite and x is
+∞ , the result is +0. -
If y>0 and y is finite and x is
-∞ , the result if an implementation-dependent approximation to +π. -
If y<0 and y is finite and x is
+∞ , the result is -0. -
If y<0 and y is finite and x is
-∞ , the result is an implementation-dependent approximation to -π. -
If y is
+∞ and x is finite, the result is an implementation-dependent approximation to +π/2. -
If y is
-∞ and x is finite, the result is an implementation-dependent approximation to -π/2. -
If y is
+∞ and x is+∞ , the result is an implementation-dependent approximation to +π/4. -
If y is
+∞ and x is-∞ , the result is an implementation-dependent approximation to +3π/4. -
If y is
-∞ and x is+∞ , the result is an implementation-dependent approximation to -π/4. -
If y is
-∞ and x is-∞ , the result is an implementation-dependent approximation to -3π/4.
20.2.2.9 Math.cbrt ( x )
Returns an implementation-dependent approximation to the cube root of x.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ .
20.2.2.10 Math.ceil ( x )
Returns the smallest (closest to
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . - If x is less than 0 but greater than -1, the result is -0.
The value of Math.ceil(x) is the same as the value of -Math.floor(-x).
20.2.2.11 Math.clz32 ( x )
When Math.clz32 is called with one argument x, the following steps are taken:
- Let n be
ToUint32 (x). - Let p be the number of leading zero bits in the 32-bit binary representation of n.
- Return p.
If n is 0, p will be 32. If the most significant bit of the 32-bit binary encoding of n is 1, p will be 0.
20.2.2.12 Math.cos ( x )
Returns an implementation-dependent approximation to the cosine of x. The argument is expressed in radians.
- If x is NaN, the result is NaN.
- If x is +0, the result is 1.
- If x is -0, the result is 1.
-
If x is
+∞ , the result is NaN. -
If x is
-∞ , the result is NaN.
20.2.2.13 Math.cosh ( x )
Returns an implementation-dependent approximation to the hyperbolic cosine of x.
- If x is NaN, the result is NaN.
- If x is +0, the result is 1.
- If x is -0, the result is 1.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is+∞ .
The value of cosh(x) is the same as (exp(x) + exp(-x))/2.
20.2.2.14 Math.exp ( x )
Returns an implementation-dependent approximation to the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms).
- If x is NaN, the result is NaN.
- If x is +0, the result is 1.
- If x is -0, the result is 1.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is +0.
20.2.2.15 Math.expm1 ( x )
Returns an implementation-dependent approximation to subtracting 1 from the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms). The result is computed in a way that is accurate even when the value of x is close 0.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is -1.
20.2.2.16 Math.floor ( x )
Returns the greatest (closest to
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . - If x is greater than 0 but less than 1, the result is +0.
The value of Math.floor(x) is the same as the value of -Math.ceil(-x).
20.2.2.17 Math.fround ( x )
When Math.fround is called with argument x the following steps are taken:
- If x is NaN, return NaN.
- If x is one of +0, -0,
+∞ ,-∞ , return x. - Let x32 be the result of converting x to a value in IEEE 754-2008 binary32 format using roundTiesToEven.
- Let x64 be the result of converting x32 to a value in IEEE 754-2008 binary64 format.
- Return the ECMAScript Number value corresponding to x64.
20.2.2.18 Math.hypot ( value1 , value2 , …values )
Math.hypot returns an implementation-dependent approximation of the square root of the sum of squares of its arguments.
- If no arguments are passed, the result is +0.
-
If any argument is
+∞ , the result is+∞ . -
If any argument is
-∞ , the result is+∞ . -
If no argument is
+∞ or-∞ , and any argument is NaN, the result is NaN. - If all arguments are either +0 or -0, the result is +0.
The length property of the hypot function is 2.
Implementations should take care to avoid the loss of precision from overflows and underflows that are prone to occur in naive implementations when this function is called with two or more arguments.
20.2.2.19 Math.imul ( x, y )
20.2.2.20 Math.log ( x )
Returns an implementation-dependent approximation to the natural logarithm of x.
- If x is NaN, the result is NaN.
- If x is less than 0, the result is NaN.
-
If x is +0 or -0, the result is
-∞ . - If x is 1, the result is +0.
-
If x is
+∞ , the result is+∞ .
20.2.2.21 Math.log1p ( x )
Returns an implementation-dependent approximation to the natural logarithm of 1 + x. The result is computed in a way that is accurate even when the value of x is close to zero.
- If x is NaN, the result is NaN.
- If x is less than -1, the result is NaN.
-
If x is -1, the result is
-∞ . - If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ .
20.2.2.22 Math.log10 ( x )
Returns an implementation-dependent approximation to the base 10 logarithm of x.
- If x is NaN, the result is NaN.
- If x is less than 0, the result is NaN.
-
If x is +0, the result is
-∞ . -
If x is -0, the result is
-∞ . - If x is 1, the result is +0.
-
If x is
+∞ , the result is+∞ .
20.2.2.23 Math.log2 ( x )
Returns an implementation-dependent approximation to the base 2 logarithm of x.
- If x is NaN, the result is NaN.
- If x is less than 0, the result is NaN.
-
If x is +0, the result is
-∞ . -
If x is -0, the result is
-∞ . - If x is 1, the result is +0.
-
If x is
+∞ , the result is+∞ .
20.2.2.24 Math.max ( value1, value2 , …values )
Given zero or more arguments, calls
-
If no arguments are given, the result is
-∞ . - If any value is NaN, the result is NaN.
-
The comparison of values to determine the largest value is done using the
Abstract Relational Comparison algorithm (7.2.11 ) except that +0 is considered to be larger than -0.
The length property of the max method is 2.
20.2.2.25 Math.min ( value1, value2 , …values )
Given zero or more arguments, calls
-
If no arguments are given, the result is
+∞ . - If any value is NaN, the result is NaN.
-
The comparison of values to determine the smallest value is done using the
Abstract Relational Comparison algorithm (7.2.11 ) except that +0 is considered to be larger than -0.
The length property of the min method is 2.
20.2.2.26 Math.pow ( x, y )
Returns an implementation-dependent approximation to the result of raising x to the power y.
- If y is NaN, the result is NaN.
- If y is +0, the result is 1, even if x is NaN.
- If y is -0, the result is 1, even if x is NaN.
- If x is NaN and y is nonzero, the result is NaN.
-
If abs(x)>1 and y is
+∞ , the result is+∞ . -
If abs(x)>1 and y is
-∞ , the result is +0. -
If abs(x) is 1 and y is
+∞ , the result is NaN. -
If abs(x) is 1 and y is
-∞ , the result is NaN. -
If abs(x)<1 and y is
+∞ , the result is +0. -
If abs(x)<1 and y is
-∞ , the result is+∞ . -
If x is
+∞ and y>0, the result is+∞ . -
If x is
+∞ and y<0, the result is +0. -
If x is
-∞ and y>0 and y is an odd integer, the result is-∞ . -
If x is
-∞ and y>0 and y is not an odd integer, the result is+∞ . -
If x is
-∞ and y<0 and y is an odd integer, the result is -0. -
If x is
-∞ and y<0 and y is not an odd integer, the result is +0. - If x is +0 and y>0, the result is +0.
-
If x is +0 and y<0, the result is
+∞ . - If x is -0 and y>0 and y is an odd integer, the result is -0.
- If x is -0 and y>0 and y is not an odd integer, the result is +0.
-
If x is -0 and y<0 and y is an odd integer, the result is
-∞ . -
If x is -0 and y<0 and y is not an odd integer, the result is
+∞ . - If x<0 and x is finite and y is finite and y is not an integer, the result is NaN.
20.2.2.27 Math.random ( )
Returns a Number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This function takes no arguments.
Each Math.random function created for distinct code Realms must produce a distinct sequence of values from successive calls.
20.2.2.28 Math.round ( x )
Returns the Number value that is closest to x and is equal to a mathematical integer. If two integer Number values are equally close to x, then the result is the Number value that is closer to
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . - If x is greater than 0 but less than 0.5, the result is +0.
- If x is less than 0 but greater than or equal to -0.5, the result is -0.
Math.round(3.5) returns 4, but Math.round(-3.5) returns -3.
The value of Math.round(x) is not always the same as the value of Math.floor(x+0.5). When x is Math.round(x) returns Math.floor(x+0.5) returns Math.round(x) may also differ from the value of Math.floor(x+0.5)because of internal rounding when computing x+0.5.
20.2.2.29 Math.sign(x)
Returns the sign of the x, indicating whether x is positive, negative or zero.
- If x is NaN, the result is NaN.
- If x is -0, the result is -0.
- If x is +0, the result is +0.
- If x is negative and not -0, the result is -1.
- If x is positive and not +0, the result is +1.
20.2.2.30 Math.sin ( x )
Returns an implementation-dependent approximation to the sine of x. The argument is expressed in radians.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ or-∞ , the result is NaN.
20.2.2.31 Math.sinh( x )
Returns an implementation-dependent approximation to the hyperbolic sine of x.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ .
The value of sinh(x) is the same as (exp(x) - exp(-x))/2.
20.2.2.32 Math.sqrt ( x )
Returns an implementation-dependent approximation to the square root of x.
- If x is NaN, the result is NaN.
- If x is less than 0, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is+∞ .
20.2.2.33 Math.tan ( x )
Returns an implementation-dependent approximation to the tangent of x. The argument is expressed in radians.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ or-∞ , the result is NaN.
20.2.2.34 Math.tanh ( x )
Returns an implementation-dependent approximation to the hyperbolic tangent of x.
- If x is NaN, the result is NaN.
- If x is +0, the result is +0.
- If x is -0, the result is -0.
-
If x is
+∞ , the result is +1. -
If x is
-∞ , the result is -1.
The value of tanh(x) is the same as (exp(x) - exp(-x))/(exp(x) + exp(-x)).
20.2.2.35 Math.trunc ( x )
Returns the integral part of the number x, removing any fractional digits. If x is already an integer, the result is x.
- If x is NaN, the result is NaN.
- If x is -0, the result is -0.
- If x is +0, the result is +0.
-
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . - If x is greater than 0 but less than 1, the result is +0.
- If x is less than 0 but greater than -1, the result is -0.
20.3 Date Objects
20.3.1 Overview of Date Objects and Definitions of Abstract Operations
The following functions are abstract operations that operate on time values (defined in
20.3.1.1 Time Values and Time Range
A Date object contains a Number indicating a particular instant in time to within a millisecond. Such a Number is called a time value. A time value may also be
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC. In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day. ECMAScript Number values can represent all integers from -9,007,199,254,740,992 to 9,007,199,254,740,992; this range suffices to measure times to millisecond precision for any instant that is within approximately 285,616 years, either forward or backward, from 01 January, 1970 UTC.
The actual range of times supported by ECMAScript Date objects is slightly smaller: exactly -100,000,000 days to 100,000,000 days measured relative to midnight at the beginning of 01 January, 1970 UTC. This gives a range of 8,640,000,000,000,000 milliseconds to either side of 01 January, 1970 UTC.
The exact moment of midnight at the beginning of 01 January, 1970 UTC is represented by the value
20.3.1.2 Day Number and Time within Day
A given
where the number of milliseconds per day is
The remainder is called the time within the day:
20.3.1.3 Year Number
ECMAScript uses an extrapolated Gregorian system to map a day number to a year number and to determine the month and date within that year. In this system, leap years are precisely those which are (divisible by 4) and ((not divisible by 100) or (divisible by 400)). The number of days in year number y is therefore defined by
All non-leap years have 365 days with the usual number of days per month and leap years have an extra day in February. The day number of the first day of year y is given by:
The
A
The leap-year function is 1 for a time within a leap year and otherwise is zero:
20.3.1.4 Month Number
Months are identified by an integer in the range 0 to 11, inclusive. The mapping MonthFromTime(t) from a
where
A month value of 0 specifies January; 1 specifies February; 2 specifies March; 3 specifies April; 4 specifies May; 5 specifies June; 6 specifies July; 7 specifies August; 8 specifies September; 9 specifies October; 10 specifies November; and 11 specifies December. Note that
20.3.1.5 Date Number
A date number is identified by an integer in the range 1 through 31, inclusive. The mapping DateFromTime(t) from a
20.3.1.6 Week Day
The weekday for a particular
A weekday value of 0 specifies Sunday; 1 specifies Monday; 2 specifies Tuesday; 3 specifies Wednesday; 4 specifies Thursday; 5 specifies Friday; and 6 specifies Saturday. Note that
20.3.1.7 Local Time Zone Adjustment
An implementation of ECMAScript is expected to determine the local time zone adjustment. The local time zone adjustment is a value LocalTZA measured in milliseconds which when added to UTC represents the local standard time. Daylight saving time is not reflected by LocalTZA.
It is recommended that implementations use the time zone information of the IANA Time Zone Database http://www.iana.org/time-zones/.
20.3.1.8 Daylight Saving Time Adjustment
An implementation dependent algorithm using best available information on time zones to determine the local daylight saving time adjustment DaylightSavingTA(t), measured in milliseconds. An implementation of ECMAScript is expected to make its best effort to determine the local daylight saving time adjustment.
It is recommended that implementations use the time zone information of the IANA Time Zone Database http://www.iana.org/time-zones/.
20.3.1.9 LocalTime ( t )
The abstract operation LocalTime with argument t converts t from UTC to local time by performing the following steps:
ReturnIfAbrupt (t).- Return t +
LocalTZA + DaylightSavingTA(t).
20.3.1.10 UTC ( t )
The abstract operation UTC with argument t converts t from local time to UTC is defined by performing the following steps:
ReturnIfAbrupt (t).- Return t -
LocalTZA - DaylightSavingTA(t -LocalTZA ).
20.3.1.11 Hours, Minutes, Second, and Milliseconds
The following abstract operations are useful in decomposing time values:
where
20.3.1.12 MakeTime (hour, min, sec, ms)
The abstract operation MakeTime calculates a number of milliseconds from its four arguments, which must be ECMAScript Number values. This operator functions as follows:
- If hour is not finite or min is not finite or sec is not finite or ms is not finite, return
NaN . - Let h be
ToInteger (hour). - Let m be
ToInteger (min). - Let s be
ToInteger (sec). - Let milli be
ToInteger (ms). - Let t be h
*msPerHour+m*msPerMinute+s*msPerSecond+milli, performing the arithmetic according to IEEE 754-2008 rules (that is, as if using the ECMAScript operators*and+). - Return t.
20.3.1.13 MakeDay (year, month, date)
The abstract operation MakeDay calculates a number of days from its three arguments, which must be ECMAScript Number values. This operator functions as follows:
- If year is not finite or month is not finite or date is not finite, return
NaN . - Let y be
ToInteger (year). - Let m be
ToInteger (month). - Let dt be
ToInteger (date). - Let ym be y + floor(m /12).
- Let mn be m modulo 12.
- Find a value t such that YearFromTime(t) is ym and MonthFromTime(t) is mn and DateFromTime(t) is 1; but if this is not possible (because some argument is out of range), return
NaN . - Return Day(t) + dt - 1.
20.3.1.14 MakeDate (day, time)
The abstract operation MakeDate calculates a number of milliseconds from its two arguments, which must be ECMAScript Number values. This operator functions as follows:
- If day is not finite or time is not finite, return
NaN . - Return day × msPerDay + time.
20.3.1.15 TimeClip (time)
The abstract operation TimeClip calculates a number of milliseconds from its argument, which must be an ECMAScript Number value. This operator functions as follows:
- If time is not finite, return
NaN . - If abs(time) > 8.64 × 1015, return
NaN . - Return
ToInteger (time) + (+0 ). (Adding a positive zero converts-0 to+0 .)
The point of step 3 is that an implementation is permitted a choice of internal representations of time values, for example as a 64-bit signed integer or as a 64-bit floating-point value. Depending on the implementation, this internal representation may or may not distinguish
20.3.1.16 Date Time String Format
ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 Extended Format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ
Where the fields are as follows:
YYYY
|
is the decimal digits of the year 0000 to 9999 in the Gregorian calendar. |
-
|
"-" (hyphen) appears literally twice in the string.
|
MM
|
is the month of the year from 01 (January) to 12 (December). |
DD
|
is the day of the month from 01 to 31. |
T
|
"T" appears literally in the string, to indicate the beginning of the time element.
|
HH
|
is the number of complete hours that have passed since midnight as two decimal digits from 00 to 24. |
:
|
":" (colon) appears literally twice in the string.
|
mm
|
is the number of complete minutes since the start of the hour as two decimal digits from 00 to 59. |
ss
|
is the number of complete seconds since the start of the minute as two decimal digits from 00 to 59. |
.
|
"." (dot) appears literally in the string.
|
sss
|
is the number of complete milliseconds since the start of the second as three decimal digits. |
Z
|
is the time zone offset specified as "Z" (for UTC) or either "+" or "-" followed by a time expression HH:mm
|
This format includes date-only forms:
YYYY
YYYY-MM
YYYY-MM-DD
It also includes “date-time” forms that consist of one of the above date-only forms immediately followed by one of the following time forms with an optional time zone offset appended:
THH:mm
THH:mm:ss
THH:mm:ss.sss
All numbers must be base 10. If the MM or DD fields are absent "01" is used as the value. If the HH, mm, or ss fields are absent "00" is used as the value and the value of an absent sss field is "000". If the time zone offset is absent, the date-time is interpreted as a local time.
Illegal values (out-of-bounds as well as syntax errors) in a format string means that the format string is not a valid instance of this format.
As every day both starts and ends with midnight, the two notations 00:00 and 24:00 are available to distinguish the two midnights that can be associated with one date. This means that the following two notations refer to exactly the same point in time: 1995-02-04T24:00 and 1995-02-05T00:00
There exists no international standard that specifies abbreviations for civil time zones like CET, EST, etc. and sometimes the same abbreviation is even used for two very different time zones. For this reason, ISO 8601 and this format specifies numeric representations of date and time.
20.3.1.16.1 Extended years
ECMAScript requires the ability to specify 6 digit years (extended years); approximately 285,426 years, either forward or backward, from 01 January, 1970 UTC. To represent years before 0 or after 9999, ISO 8601 permits the expansion of the year representation, but only by prior agreement between the sender and the receiver. In the simplified ECMAScript format such an expanded year representation shall have 2 extra year digits and is always prefixed with a + or - sign. The year 0 is considered positive and hence prefixed with a + sign.
Examples of extended years:
|
-283457-03-21T15:00:59.008Z |
283458 B.C. |
|
-000001-01-01T00:00:00Z |
2 B.C. |
|
+000000-01-01T00:00:00Z |
1 B.C. |
|
+000001-01-01T00:00:00Z |
1 A.D. |
|
+001970-01-01T00:00:00Z |
1970 A.D. |
|
+002009-12-15T00:00:00Z |
2009 A.D. |
|
+287396-10-12T08:59:00.992Z |
287396 A.D. |
20.3.2 The Date Constructor
The Date constructor is the Date property of the global object. When called as a constructor it creates and initializes a new Date object. When Date is called as a function rather than as a constructor, it returns a String representing the current time (UTC).
The Date constructor is a single function whose behaviour is overloaded based upon the number and types of its arguments.
The Date constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Date behaviour must include a super call to the Date constructor to create and initialize the subclass instance with a [[DateValue]] internal slot.
20.3.2.1 Date ( year, month [, date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] )
This description applies only if the Date constructor is called with at least two arguments.
When the Date function is called the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs ≥ 2.
- If NewTarget is not
undefined , then- Let y be
ToNumber (year). ReturnIfAbrupt (y).- Let m be
ToNumber (month). ReturnIfAbrupt (m).- If date is supplied, let dt be
ToNumber (date); else let dt be 1. ReturnIfAbrupt (dt).- If hours is supplied, let h be
ToNumber (hours); else let h be 0. ReturnIfAbrupt (h).- If minutes is supplied, let min be
ToNumber (minutes); else let min be 0. ReturnIfAbrupt (min).- If seconds is supplied, let s be
ToNumber (seconds); else let s be 0. ReturnIfAbrupt (s).- If ms is supplied, let milli be
ToNumber (ms); else let milli be 0. ReturnIfAbrupt (milli).- If y is not
NaN and 0 ≤ToInteger (y) ≤ 99, let yr be 1900+ToInteger (y); otherwise, let yr be y. - Let finalDate be
MakeDate (MakeDay (yr, m, dt),MakeTime (h, min, s, milli)). - Let O be
OrdinaryCreateFromConstructor (NewTarget,"%DatePrototype%", « [[DateValue]]»). ReturnIfAbrupt (O).- Set the [[DateValue]] internal slot of O to
TimeClip (UTC (finalDate)). - Return O.
- Let y be
- Else,
- Let now be the Number that is the
time value (UTC) identifying the current time. - Return
ToDateString (now).
- Let now be the Number that is the
20.3.2.2 Date ( value )
This description applies only if the Date constructor is called with exactly one argument.
When the Date function is called the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs = 1.
- If NewTarget is not
undefined , then- If
Type (value) is Object and value has a [[DateValue]] internal slot, then- Let tv be thisTimeValue(value).
- Else,
- Let v be
ToPrimitive (value). - If
Type (v) is String, then- Let tv be the result of parsing v as a date, in exactly the same manner as for the
parsemethod (20.3.3.2 ). If the parse resulted in anabrupt completion , tv is theCompletion Record.
- Let tv be the result of parsing v as a date, in exactly the same manner as for the
- Else,
- Let tv be
ToNumber (v).
- Let tv be
- Let v be
ReturnIfAbrupt (tv).- Let O be
OrdinaryCreateFromConstructor (NewTarget,"%DatePrototype%", « [[DateValue]]»). ReturnIfAbrupt (O).- Set the [[DateValue]] internal slot of O to
TimeClip (tv). - Return O.
- If
- Else,
- Let now be the Number that is the
time value (UTC) identifying the current time. - Return
ToDateString (now).
- Let now be the Number that is the
20.3.2.3 Date ( )
This description applies only if the Date constructor is called with no arguments.
When the Date function is called the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs = 0.
- If NewTarget is not
undefined , then- Let O be
OrdinaryCreateFromConstructor (NewTarget,"%DatePrototype%", « [[DateValue]]»). ReturnIfAbrupt (O).- Set the [[DateValue]] internal slot of O to the
time value (UTC) identifying the current time. - Return O.
- Let O be
- Else,
- Let now be the Number that is the
time value (UTC) identifying the current time. - Return
ToDateString (now).
- Let now be the Number that is the
20.3.3 Properties of the Date Constructor
The value of the [[Prototype]] internal slot of the Date constructor is the intrinsic object
Besides the length property (whose value is 7), the Date constructor has the following properties:
20.3.3.1 Date.now ( )
The now function returns a Number value that is the now.
20.3.3.2 Date.parse ( string )
The parse function applies the parse interprets the resulting String as a date and time; it returns a Number, the UTC Date.parse to return
If x is any Date object whose milliseconds amount is zero within a particular implementation of ECMAScript, then all of the following expressions should produce the same numeric value in that implementation, if all the properties referenced have their initial values:
x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())
However, the expression
Date.parse(x.toLocaleString())
is not required to produce the same Number value as the preceding three expressions and, in general, the value produced by Date.parse is implementation-dependent when given any String value that does not conform to the Date Time String Format (toString or toUTCString method.
20.3.3.3 Date.prototype
The initial value of Date.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
20.3.3.4 Date.UTC ( year, month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] )
When the UTC function is called with fewer than two arguments, the behaviour is implementation-dependent. When the UTC function is called with two to seven arguments, it computes the date from year, month and (optionally) date, hours, minutes, seconds and ms. The following steps are taken:
- Let y be
ToNumber (year). ReturnIfAbrupt (y).- Let m be
ToNumber (month). ReturnIfAbrupt (m).- If date is supplied, let dt be
ToNumber (date); else let dt be 1. ReturnIfAbrupt (dt).- If hours is supplied, let h be
ToNumber (hours); else let h be 0. ReturnIfAbrupt (h).- If minutes is supplied, let min be
ToNumber (minutes); else let min be 0. ReturnIfAbrupt (min).- If seconds is supplied, let s be
ToNumber (seconds); else let s be 0. ReturnIfAbrupt (s).- If ms is supplied, let milli be
ToNumber (ms); else let milli be 0. ReturnIfAbrupt (milli).- If y is not
NaN and 0 ≤ToInteger (y) ≤ 99, let yr be 1900+ToInteger (y); otherwise, let yr be y. - Return
TimeClip (MakeDate (MakeDay (yr, m, dt),MakeTime (h, min, s, milli))).
The length property of the UTC function is 7.
The UTC function differs from the Date constructor in two ways: it returns a
20.3.4 Properties of the Date Prototype Object
The Date prototype object is the intrinsic object
The value of the [[Prototype]] internal slot of the Date prototype object is the intrinsic object
Unless explicitly defined otherwise, the methods of the Date prototype object defined below are not generic and the
The abstract operation
- If
Type (value) is Object and value has a [[DateValue]] internal slot, then- Return the value of value's [[DateValue]] internal slot.
- Throw a
TypeError exception.
In following descriptions of functions that are properties of the Date prototype object, the phrase “this Date object” refers to the object that is the
20.3.4.1 Date.prototype.constructor
The initial value of Date.prototype.constructor is the intrinsic object
20.3.4.2 Date.prototype.getDate ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return DateFromTime(
LocalTime (t)).
20.3.4.3 Date.prototype.getDay ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return WeekDay(
LocalTime (t)).
20.3.4.4 Date.prototype.getFullYear ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return YearFromTime(
LocalTime (t)).
20.3.4.5 Date.prototype.getHours ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return HourFromTime(
LocalTime (t)).
20.3.4.6 Date.prototype.getMilliseconds ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return msFromTime(
LocalTime (t)).
20.3.4.7 Date.prototype.getMinutes ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return MinFromTime(
LocalTime (t)).
20.3.4.8 Date.prototype.getMonth ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return MonthFromTime(
LocalTime (t)).
20.3.4.9 Date.prototype.getSeconds ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return SecFromTime(
LocalTime (t)).
20.3.4.10 Date.prototype.getTime ( )
The following steps are performed:
- Return
this time value .
20.3.4.11 Date.prototype.getTimezoneOffset ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return (t -
LocalTime (t)) / msPerMinute.
20.3.4.12 Date.prototype.getUTCDate ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return DateFromTime(t).
20.3.4.13 Date.prototype.getUTCDay ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return WeekDay(t).
20.3.4.14 Date.prototype.getUTCFullYear ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return YearFromTime(t).
20.3.4.15 Date.prototype.getUTCHours ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return HourFromTime(t).
20.3.4.16 Date.prototype.getUTCMilliseconds ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return msFromTime(t).
20.3.4.17 Date.prototype.getUTCMinutes ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return MinFromTime(t).
20.3.4.18 Date.prototype.getUTCMonth ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return MonthFromTime(t).
20.3.4.19 Date.prototype.getUTCSeconds ( )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , returnNaN . - Return SecFromTime(t).
20.3.4.20 Date.prototype.setDate ( date )
The following steps are performed:
- Let t be
LocalTime (this time value ). ReturnIfAbrupt (t).- Let dt be
ToNumber (date). ReturnIfAbrupt (dt).- Let newDate be
MakeDate (MakeDay (YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)). - Let u be
TimeClip (UTC (newDate)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
20.3.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , let t be+0 ; otherwise, let t beLocalTime (t). ReturnIfAbrupt (t).- Let y be
ToNumber (year). ReturnIfAbrupt (y).- If month is not specified, let m be MonthFromTime(t); otherwise, let m be
ToNumber (month). ReturnIfAbrupt (m).- If date is not specified, let dt be DateFromTime(t); otherwise, let dt be
ToNumber (date). ReturnIfAbrupt (dt).- Let newDate be
MakeDate (MakeDay (y, m, dt), TimeWithinDay(t)). - Let u be
TimeClip (UTC (newDate)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setFullYear method is 3.
If month is not specified, this method behaves as if month were specified with the value getMonth(). If date is not specified, it behaves as if date were specified with the value getDate().
20.3.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )
The following steps are performed:
- Let t be
LocalTime (this time value ). ReturnIfAbrupt (t).- Let h be
ToNumber (hour). ReturnIfAbrupt (h).- If min is not specified, let m be MinFromTime(t); otherwise, let m be
ToNumber (min). ReturnIfAbrupt (m).- If sec is not specified, let s be SecFromTime(t); otherwise, let s be
ToNumber (sec). ReturnIfAbrupt (s).- If ms is not specified, let milli be msFromTime(t); otherwise, let milli be
ToNumber (ms). ReturnIfAbrupt (milli).- Let date be
MakeDate (Day(t),MakeTime (h, m, s, milli)). - Let u be
TimeClip (UTC (date)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setHours method is 4.
If min is not specified, this method behaves as if min were specified with the value getMinutes(). If sec is not specified, it behaves as if sec were specified with the value getSeconds(). If ms is not specified, it behaves as if ms were specified with the value getMilliseconds().
20.3.4.23 Date.prototype.setMilliseconds ( ms )
The following steps are performed:
- Let t be
LocalTime (this time value ). ReturnIfAbrupt (t).- Let ms be
ToNumber (ms). ReturnIfAbrupt (ms).- Let time be
MakeTime (HourFromTime(t), MinFromTime(t), SecFromTime(t), ms). - Let u be
TimeClip (UTC (MakeDate (Day(t), time))). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
20.3.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )
The following steps are performed:
- Let t be
LocalTime (this time value ). ReturnIfAbrupt (t).- Let m be
ToNumber (min). ReturnIfAbrupt (m).- If sec is not specified, let s be SecFromTime(t); otherwise, let s be
ToNumber (sec). ReturnIfAbrupt (s).- If ms is not specified, let milli be msFromTime(t); otherwise, let milli be
ToNumber (ms). ReturnIfAbrupt (milli).- Let date be
MakeDate (Day(t),MakeTime (HourFromTime(t), m, s, milli)). - Let u be
TimeClip (UTC (date)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setMinutes method is 3.
If sec is not specified, this method behaves as if sec were specified with the value getSeconds(). If ms is not specified, this behaves as if ms were specified with the value getMilliseconds().
20.3.4.25 Date.prototype.setMonth ( month [ , date ] )
The following steps are performed:
- Let t be
LocalTime (this time value ). ReturnIfAbrupt (t).- Let m be
ToNumber (month). ReturnIfAbrupt (m).- If date is not specified, let dt be DateFromTime(t); otherwise, let dt be
ToNumber (date). ReturnIfAbrupt (dt).- Let newDate be
MakeDate (MakeDay (YearFromTime(t), m, dt), TimeWithinDay(t)). - Let u be
TimeClip (UTC (newDate)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setMonth method is 2.
If date is not specified, this method behaves as if date were specified with the value getDate().
20.3.4.26 Date.prototype.setSeconds ( sec [ , ms ] )
The following steps are performed:
- Let t be
LocalTime (this time value ). ReturnIfAbrupt (t).- Let s be
ToNumber (sec). ReturnIfAbrupt (s).- If ms is not specified, let milli be msFromTime(t); otherwise, let milli be
ToNumber (ms). ReturnIfAbrupt (milli).- Let date be
MakeDate (Day(t),MakeTime (HourFromTime(t), MinFromTime(t), s, milli)). - Let u be
TimeClip (UTC (date)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setSeconds method is 2.
If ms is not specified, this method behaves as if ms were specified with the value getMilliseconds().
20.3.4.27 Date.prototype.setTime ( time )
The following steps are performed:
- Let valueNotUsed be
this time value . ReturnIfAbrupt (valueNotUsed).- Let t be
ToNumber (time). ReturnIfAbrupt (t).- Let v be
TimeClip (t). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
20.3.4.28 Date.prototype.setUTCDate ( date )
- Let t be
this time value . ReturnIfAbrupt (t).- Let dt be
ToNumber (date). ReturnIfAbrupt (dt).- Let newDate be
MakeDate (MakeDay (YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
20.3.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- If t is
NaN , let t be+0 . - Let y be
ToNumber (year). ReturnIfAbrupt (y).- If month is not specified, let m be MonthFromTime(t); otherwise, let m be
ToNumber (month). ReturnIfAbrupt (m).- If date is not specified, let dt be DateFromTime(t); otherwise, let dt be
ToNumber (date). ReturnIfAbrupt (dt).- Let newDate be
MakeDate (MakeDay (y, m, dt), TimeWithinDay(t)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCFullYear method is 3.
If month is not specified, this method behaves as if month were specified with the value getUTCMonth(). If date is not specified, it behaves as if date were specified with the value getUTCDate().
20.3.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- Let h be
ToNumber (hour). ReturnIfAbrupt (h).- If min is not specified, let m be MinFromTime(t); otherwise, let m be
ToNumber (min). ReturnIfAbrupt (m).- If sec is not specified, let s be SecFromTime(t); otherwise, let s be
ToNumber (sec). ReturnIfAbrupt (s).- If ms is not specified, let milli be msFromTime(t); otherwise, let milli be
ToNumber (ms). ReturnIfAbrupt (milli).- Let newDate be
MakeDate (Day(t),MakeTime (h, m, s, milli)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCHours method is 4.
If min is not specified, this method behaves as if min were specified with the value getUTCMinutes(). If sec is not specified, it behaves as if sec were specified with the value getUTCSeconds(). If ms is not specified, it behaves as if ms were specified with the value getUTCMilliseconds().
20.3.4.31 Date.prototype.setUTCMilliseconds ( ms )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- Let milli be
ToNumber (ms). ReturnIfAbrupt (milli).- Let time be
MakeTime (HourFromTime(t), MinFromTime(t), SecFromTime(t), milli). - Let v be
TimeClip (MakeDate (Day(t), time)). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
20.3.4.32 Date.prototype.setUTCMinutes ( min [ , sec [, ms ] ] )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- Let m be
ToNumber (min). ReturnIfAbrupt (m).- If sec is not specified, let s be SecFromTime(t).
- Else
- Let s be
ToNumber (sec). ReturnIfAbrupt (s).
- Let s be
- If ms is not specified, let milli be msFromTime(t).
- Else
- Let milli be
ToNumber (ms). ReturnIfAbrupt (milli).
- Let milli be
- Let date be
MakeDate (Day(t),MakeTime (HourFromTime(t), m, s, milli)). - Let v be
TimeClip (date). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCMinutes method is 3.
If sec is not specified, this method behaves as if sec were specified with the value getUTCSeconds(). If ms is not specified, it function behaves as if ms were specified with the value return by getUTCMilliseconds().
20.3.4.33 Date.prototype.setUTCMonth ( month [ , date ] )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- Let m be
ToNumber (month). ReturnIfAbrupt (m).- If date is not specified, let dt be DateFromTime(t).
- Else
- Let dt be
ToNumber (date). ReturnIfAbrupt (dt).
- Let dt be
- Let newDate be
MakeDate (MakeDay (YearFromTime(t), m, dt), TimeWithinDay(t)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCMonth method is 2.
If date is not specified, this method behaves as if date were specified with the value getUTCDate().
20.3.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )
The following steps are performed:
- Let t be
this time value . ReturnIfAbrupt (t).- Let s be
ToNumber (sec). ReturnIfAbrupt (s).- If ms is not specified, let milli be msFromTime(t).
- Else
- Let milli be
ToNumber (ms). ReturnIfAbrupt (milli).
- Let milli be
- Let date be
MakeDate (Day(t),MakeTime (HourFromTime(t), MinFromTime(t), s, milli)). - Let v be
TimeClip (date). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCSeconds method is 2.
If ms is not specified, this method behaves as if ms were specified with the value getUTCMilliseconds().
20.3.4.35 Date.prototype.toDateString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “date” portion of the Date in the current time zone in a convenient, human-readable form.
20.3.4.36 Date.prototype.toISOString ( )
This function returns a String value representing the instance in time corresponding to
20.3.4.37 Date.prototype.toJSON ( key )
This function provides a String representation of a Date object for use by JSON.stringify (
When the toJSON method is called with argument key, the following steps are taken:
- Let O be
ToObject (this value). - Let tv be
ToPrimitive (O, hint Number). ReturnIfAbrupt (tv).- If
Type (tv) is Number and tv is not finite, returnnull . - Return
Invoke (O,"toISOString").
The argument is ignored.
The toJSON function is intentionally generic; it does not require that its toISOString method.
20.3.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Date.prototype.toLocaleDateString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleDateString method is used.
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “date” portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The length property of the toLocaleDateString method is 0.
20.3.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Date.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleString method is used.
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The length property of the toLocaleString method is 0.
20.3.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Date.prototype.toLocaleTimeString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleTimeString method is used.
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “time” portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The length property of the toLocaleTimeString method is 0.
20.3.4.41 Date.prototype.toString ( )
The following steps are performed:
- Let O be this Date object.
- If O does not have a [[DateValue]] internal slot, then
- Let tv be
NaN .
- Let tv be
- Else,
- Let tv be
this time value .
- Let tv be
- Return
ToDateString (tv).
For any Date object d whose milliseconds amount is zero, the result of Date.parse(d.toString()) is equal to d.valueOf(). See
The toString function is intentionally generic; it does not require that its
20.3.4.41.1 Runtime Semantics: ToDateString(tv)
The following steps are performed:
- Assert:
Type (tv) is Number. - If tv is
NaN , return"Invalid Date". - Return an implementation-dependent String value that represents tv as a date and time in the current time zone using a convenient, human-readable form.
20.3.4.42 Date.prototype.toTimeString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “time” portion of the Date in the current time zone in a convenient, human-readable form.
20.3.4.43 Date.prototype.toUTCString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent
The intent is to produce a String representation of a date that is more readable than the format specified in "T" used to separate the date and time elements.
20.3.4.44 Date.prototype.valueOf ( )
The valueOf function returns a Number, which is
20.3.4.45 Date.prototype [ @@toPrimitive ] ( hint )
This function is called by ECMAScript language operators to convert a Date object to a primitive value. The allowed values for hint are "default", "number", and "string". Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string", All other built-in ECMAScript objects treat "default" as being equivalent to "number".
When the @@toPrimitive method is called with argument hint, the following steps are taken:
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If hint is the String value
"string"or the String value"default", then- Let tryFirst be
"string".
- Let tryFirst be
- Else if hint is the String value
"number", then- Let tryFirst be
"number".
- Let tryFirst be
- Else, throw a
TypeError exception. - Return OrdinaryToPrimitive(O, tryFirst).
The value of the name property of this function is "[Symbol.toPrimitive]".
This property has the attributes { [[Writable]]:
20.3.5 Properties of Date Instances
Date instances are ordinary objects that inherit properties from the Date prototype object. Date instances also have a [[DateValue]] internal slot. The [[DateValue]] internal slot is the