Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— Date 对象二:构造器和原型对象上的属性 #116

Open
lizhongzhen11 opened this issue Jun 3, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

Date 对象二:构造器和原型对象上的属性

Date 构造器

  • 即固有对象 %Date%
  • 全局对象 "Date" 属性的初始值
  • 当作为构造器调用时创建并初始化一个新Date对象
  • 当作为普通函数调用时,返回一个表示当前时间的字符串(UTC)
  • 是一个函数,其行为根据其参数的数量和类型而重载
  • 被设计成子类。它可以用作类定义的 extends 子句的值。打算继承指定的 Date 行为的子类构造函数必须包括对 Date 构造函数的 super 调用,以创建和初始化具有内置插槽 [[DateValue]] 的子类实例。
  • 具有 "length"

Date ( year, month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] )

  1. 定义 numberOfArgs 为该函数调用时传递的参数数量
  2. 断言:numberOfArgs ≥ 2
  3. 如果 NewTargetundefined
    1. 定义 now 为标识当前时间的 时间值 数字
    2. 返回 ToDateString(now)
  4. 否则,
    1. 定义 y? ToNumber(year)
    2. 定义 m? ToNumber(month)
    3. 如果 date 存在,定义 dt? ToNumber(hours);否则定义 dt 为 1
    4. 如果 hours 存在,定义 h? ToNumber(date);否则定义 h 为 0
    5. 如果 minutes 存在,定义 min? ToNumber(minutes);否则定义 min 为 0
    6. 如果 seconds 存在,定义 s? ToNumber(seconds);否则定义 s 为 0
    7. 如果 ms 存在,定义 milli? ToNumber(ms);否则定义 milli 为 0
    8. 如果 yNaN,定义 yrNaN
    9. 否则,
      1. 定义 yi! ToInteger(y)
      2. 如果 0 ≤ yi ≤ 99,定义 yr1900 + yi;否则,定义 yry
    10. 定义 finalDateMakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))
    11. 定义 O? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)
    12. O.[[DateValue]] 设置为 TimeClip(UTC(finalDate))
    13. 返回 O

Date ( value )

  1. 定义 numberOfArgs 为该函数调用时传递的参数数量
  2. 断言:numberOfArgs = 1
  3. 如果 NewTargetundefined
    1. 定义 now 为标识当前时间的 时间值 数字
    2. 返回 ToDateString(now)
  4. 否则,
    1. 如果 value 是对象类型且 value[[DateValue]] 内置插槽
      1. 定义 tvthisTimeValue(value)
    2. 否则,
      1. 定义 v? ToPrimitive(value)
      2. 如果 vString 类型,
        1. 断言:下一步绝不会返回 abrupt completion,因为 vString 类型
        2. 定义 tv 是将 v 解析为日期的结果,其解析方式与 解析方法 完全相同
      3. 否则,
        1. 定义 tv? ToNumber(v)
    3. 定义 O? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)
    4. O.[[DateValue]] 设置为 TimeClip(tv)
    5. 返回 O

Date ( )

  1. 定义 numberOfArgs 为该函数调用时传递的参数数量
  2. 断言:numberOfArgs = 0
  3. 如果 NewTargetundefined
    1. 定义 now 为标识当前时间的 时间值(UTC)数字
    2. 返回 ToDateString(now)
  4. 否则,
    1. 定义 O? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)
    2. O.[[DateValue]] 设置为标识当前时间的 时间值(UTC)
    3. 返回 O

Date构造器上的属性

Date.now ( )

该函数返回一个 Number 值,该值是进行调用时的的UTC日期和时间的时间值。

Date.parse ( string )

解析函数将 ToString 运算应用于其参数。如果 ToString 导致 abrupt completion,会立即返回。否则,parse 将结果字符串解释为日期和时间;返回与该日期时间对应的UTC 时间值 数字。字符串可能被解释为本地时间,UTC时间,或其他时区的时间,由字符串内容决定。该函数首先尝试根据 日期时间字符串格式 中描述的格式解析字符串,包含扩展年份。如果字符串不符合该格式,则该函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。无法识别的字符串或包含超出范围的格式元素值的字符串应返回 NaN

如果字符串符合日期时间字符串格式,则替换值将代替缺少的格式元素。当 MMDD 元素缺失,用 "01" 代替。当 HHmmss 元素缺失,使用 "00" 代替。当 sss 元素缺失,使用 "000" 代替。当不存在UTC偏移量时,仅日期形式被解释为UTC时间,而日期时间形式被解释为本地时间。

如果 x 是在特定ECMAScript实现中毫秒数为零的Date对象,如果所有引用该对象的属性都有其初始值,则以下所有表达式在该实现中应产生相同的数值:

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())

// 但是
Date.parse(x.toLocaleString())

Date.parse(x.toLocaleString()) 不需要像前三个表达式一样产生相同的数值。通常,当给定任何不符合 日期时间字符串格式 且不能由 toStringtoUTCString 方法在该实现中生成的String值时,由Date.parse生成的值取决于实现。

Date.prototype

初始值为 %Date.prototype%

属性描述符为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )

  1. 定义 y? ToNumber(year)
  2. 如果 month 存在,定义 m? ToNumber(month);否则定义 m 为0
  3. 如果 date 存在,定义 dt? ToNumber(date);否则定义 dt 为1
  4. 如果 hours 存在,定义 h? ToNumber(hours);否则定义 h 为0
  5. 如果 minutes 存在,定义 min? ToNumber(minutes);否则定义 min 为0
  6. 如果 seconds 存在,定义 s? ToNumber(seconds);否则定义 s 为0
  7. 如果 ms 存在,定义 milli? ToNumber(ms);否则定义 milli 为0
  8. 如果 yNaN,定义 yrNaN
  9. 否则,
    1. 定义 yi! ToInteger(y)
    2. 如果 0 ≤ yi ≤ 99,定义 yr1900 + yi;否则,定义 yry
  10. 返回 TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)))

Date原型对象上的属性

  • 看MDN即可
  • 即固有对象 %DatePrototype%
  • 属于 普通对象
  • 不是Date实例,没有 [[DateValue]] 内置插槽
  • [[Prototype]] 内置插槽其值为 %Object.prototype%
@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Jun 3, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant