当控制台记录时,Javascript Date 如何打印出字符串?

Cod*_*ein 2 javascript date object

当我在 Javascript 中创建对象并将它们记录到控制台时,我几乎总是在控制台中看到一个 Javascript 对象。例如

var myObj = {
 bla: "foo"
}
console.log(myObj);
Run Code Online (Sandbox Code Playgroud)

将输出为

{
  bla: "foo"
}
Run Code Online (Sandbox Code Playgroud)

然而,Date行为不同。当我创建一个日期时,它以某种方式知道打印出代表日期对象日期的“字符串”。

例如:

var myObj = {
     date: new Date()
    }
    console.log(myObj);
Run Code Online (Sandbox Code Playgroud)

让我明白

{
   date: Sun Oct 25 2020 18:36:19 GMT-0700 (GMT-04:00)
}
Run Code Online (Sandbox Code Playgroud)

这里的根本机制是什么?我怎样才能对我自己的对象做同样的事情?

Cer*_*nce 5

这是浏览器为 Date 对象设置的特殊例外,以便在记录时轻松检查它们。否则,如果遵循默认行为,您将得到一个空对象,没有自己的属性,并且没有有关该对象实际包含的内容的有用信息:

在此输入图像描述

但是,您可以观察到一些类似的行为,并在记录某些内容时显示任意字符串(如果记录的内容被强制为字符串),通过toString在对象上放置一个方法:

const obj = {
  toString() {
    return 'foobar';
  }
};

console.log(String(obj));
Run Code Online (Sandbox Code Playgroud)

要获得像 Date 对象一样实际记录的内容,而无需您进行任何强制,您必须更改浏览器的内部代码。这不是 JS 能做的事情。

还有一些其他类型的内置对象具有特殊的日志记录行为,包括:

  • 数组
  • 功能
  • 错误