【问题标题】:Why can't Date be instantiate as not being a constructor? And other confusion为什么不能将 Date 实例化为不是构造函数?和其他混乱
【发布时间】:2016-04-23 05:22:44
【问题描述】:

我对 javascript 中的 Date 关键字有很多困惑。 MDN article 在它的第二行中声明 Date 是一个对象:

Date 对象基于...

但是typeof Date 返回"function"。第二件事是Date()——带右括号——应该是一个函数,因为foo()类型的任何东西都是一个函数,根据Douglas Crockford的书的语法一章。令人惊讶的是,typeof Date() 返回"string"。现在如果Date() 不是函数,那么new Date() 是什么?字符串构造函数?正是我的问题是:

  • 什么是Date?它是如何在 javascript 本身中定义的?
  • 什么是Date()?它与Date 有何不同?它是如何在 javascript 本身中定义的?为什么不是函数?
  • 什么是new Date()?如果Date() 是一个字符串,那么它如何充当构造函数?
  • 如果我们可以实例化new Date(),例如像new Date("October 13, 2014 11:13:00") 那么我们为什么不能像Date("October 13, 2014 11:13:00") 一样实例化原始函数Date()

【问题讨论】:

  • Date objects”指的是Date构造函数的实例对象。 Date是一个函数,Date()是函数调用的result,是一个字符串。 DateDate() 是不同的东西。
  • 你搜索过 Stack Overflow 吗? stackoverflow.com/questions/9584719/… typeof Date 返回 "function" 的事实应该很明显: Date is 一个您可以调用的函数,既可以作为函数(它会返回一个字符串)也可以作为构造函数, 以新为前缀。如您所述,在第二种情况下,它将按预期运行,构建一个新的 Date 对象。
  • typeof Date()string..当然.. 这是Date().. 返回的typeof 值。Date 将保存函数定义。这就是它的原因function.. 类型的function foo() 是一个函数定义.. 并且foo() 正在调用该函数.. 它可以返回任何原始类型的数据.. new 运算符创建用户定义的实例对象类型或具有构造函数的内置对象类型之一
  • 写这个:function test() { return ''; } console.log(typeof test()); var t = new test(); console.log(typeof t);
  • @RayonDabre 如果我没听错,这意味着typeof 返回函数的return 值的type

标签: javascript function date datetime object


【解决方案1】:

日期类型返回“函数”,因为那是日期构造函数的类型。使用 Date() 而不使用 new 关键字,将以字符串格式返回日期/时间。但如果你创建var foo = new Date()typeof foo 将是对象。

【讨论】:

  • 那么是不是意味着Date()在类似函数调用的语句中,Date();是一个字符串,但是Date()在语句var foo = new Date()中实际上是Date 构造函数?我接受这一点,但我的问题仍然存在。正如道格拉斯的书foo() 是函数的语法而不是字符串的语法。如果Date 是一个构造函数,那么它就是一个函数——但它的右括号在哪里?同一个东西Date()怎么会有不同的含义——看起来有点像没有参数的重载,奇怪。
  • @user31782,你读错了...foo()是一个函数调用...function foo(){}是一个function-definition..不要责怪Douglas
【解决方案2】:

感谢 Ryon Dabre 消除了一些疑虑。混淆的第一个来源是typeof footype of foo() 应该是同一件事,但它们不是。假设我有一个函数

function foo() {
        var len = 10;
        alert("hello");
        return 5;
     }

现在typeof foo 将返回"function"typeof foo() 将返回"number"foo 语句实际上被转换为 foo 的定义,例如

function bar(){
  return 6;
}
bar = foo;

bar 变为 foo。现在bar 的返回值是 5 而不是 6——就像 var x = 1; var y = 2; x = y; 使 x 2 一样。foo 不在表达式中执行。在控制台中键入 foo 会返回 "function foo()"。即foo是函数类型的变量。所以foo 的类型是函数。

另一方面,只要 javascript 看到 foo(),它就会简单地执行它。所以在bar = foo() 第一个foo() 将被执行。现在分配给bar 的值是什么——foo() 返回的值。此外,这里也会发生类型转换。 bar 将不再是一个函数。 typeof bar 将返回 "number"。实际上typeof foo()typeof bar 都是"number",唯一的区别是语句typeof foo() 将首先执行foo()。在javascript中typeof foo()被翻译成两条语句:
1.执行foo.
2.typeof value_returned_by_foo


在概念澄清之后,现在让我们讨论一下Date()。日期定义如下:

function Date2(today1) {
        var today;
        this.today = today1;            
        return (today || "23rd april");
    }

typeof Date2 显然是"function"。由于Date2 返回一个字符串,所以typeof Date2()"string"Date2() 只返回字符串“23rd April”。 Date2("Monday") 也返回 4 月 23 日,因为 today 仍未定义。但是,当Date2 用作构造函数时,today 会采用传递的值。例如。 var crux = new Date2("Saturday"); 然后crux.today 周六返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多