console.log 如何将 javascript 日期对象转换为人类可读的格式
How does console.log convert javascript date object into human readable format
console.log({a:new Date()})
的输出是 { a: 2019-05-19T11:30:57.514Z }
JSON.stringify({a:new Date()})
的值为 {"a":"2019-05-19T11:33:12.591Z"}
覆盖后:Date.prototype.toJSON = function(){ return this.toLocaleString(); }
JSON.stringify({a:new Date()})
的值为 {"a":"5/19/2019, 5:09:31 PM"}
但是console.log({a:new Date()})
的输出仍然是{ a: 2019-05-19T11:41:31.256Z }
尝试覆盖其他 Date.prototype
方法,例如 toISOString()
、toSource
、toString
、toUTCString
、valueOf
和许多其他方法。但是 none 有所帮助。
看不懂v8 js引擎的原生源代码。
有什么方法可以覆盖行为以获得所需的结果?
这取决于控制台实现,它不在 V8 中而是在主机中(Chrome、Chromium、Node.js、...)。
Node.js 用于查找名为 inspect
的成员(至少在 v4 中)并在存在时使用它,但事实证明这是一个兼容性问题并且它没有以后别这样了。
我认为没有任何方法可以覆盖 built-in 对象的控制台渲染,尤其是跨主机环境。
您在执行 console.log() 时并未将新的 date() 转换为 json。可以这么写。
Date.prototype.toJSON = function(){ return this.toLocaleString(); }
console.log({a:JSON.stringify(new Date())})
控制台使用 toString
将日期(和其他对象)转换为字符串以供打印。所以你可以覆盖 Date.prototype.toString
来改变打印的内容。演示(copy-pasted 来自 Chrome 控制台会话):
> var d = new Date()
> console.log(d)
< Sun May 19 2019 14:29:02 GMT+0200 (Central European Summer Time)
> Date.prototype.toString = Date.prototype.toLocaleString
< ƒ toLocaleString() { [native code] }
> console.log(d)
< 5/19/2019, 2:29:02 PM
> console.log({a:new Date()})
< {a: 5/19/2019, 2:31:21 PM}
另一个问题是 JSON.stringify({a: 1})
给出 {"a":1}
,而 console.log({a: 1})
输出 {a: 1}
(a
周围没有引号)。这与日期无关,是因为 JSON 是 JavaScript 的一个非常有限的子集({a: 1}
有效 JavaScript 但无效 JSON) .此外,console.log
是供人类使用的,不需要将输出解析回原始对象——只需考虑 console.log(new Array(100))
的作用:-)
编辑:以上内容适用于 Chrome。由于 console
对象未包含在 ECMAScript 规范中,因此每个嵌入者都可以提供他们认为在那里有用的任何内容。 Node.js uses util.format
, which in turn uses util.inspect
, which in turn gets the toISOString
function from the primordial Date.prototype
,这意味着你不能覆盖它(这是一个特性,因为这意味着你不能破坏它,或者是一个限制,因为它意味着你不能自定义它,取决于你的观点)。
console.log({a:new Date()})
的输出是 { a: 2019-05-19T11:30:57.514Z }
JSON.stringify({a:new Date()})
的值为 {"a":"2019-05-19T11:33:12.591Z"}
覆盖后:Date.prototype.toJSON = function(){ return this.toLocaleString(); }
JSON.stringify({a:new Date()})
的值为 {"a":"5/19/2019, 5:09:31 PM"}
但是console.log({a:new Date()})
的输出仍然是{ a: 2019-05-19T11:41:31.256Z }
尝试覆盖其他 Date.prototype
方法,例如 toISOString()
、toSource
、toString
、toUTCString
、valueOf
和许多其他方法。但是 none 有所帮助。
看不懂v8 js引擎的原生源代码。
有什么方法可以覆盖行为以获得所需的结果?
这取决于控制台实现,它不在 V8 中而是在主机中(Chrome、Chromium、Node.js、...)。
Node.js 用于查找名为 inspect
的成员(至少在 v4 中)并在存在时使用它,但事实证明这是一个兼容性问题并且它没有以后别这样了。
我认为没有任何方法可以覆盖 built-in 对象的控制台渲染,尤其是跨主机环境。
您在执行 console.log() 时并未将新的 date() 转换为 json。可以这么写。
Date.prototype.toJSON = function(){ return this.toLocaleString(); }
console.log({a:JSON.stringify(new Date())})
控制台使用 toString
将日期(和其他对象)转换为字符串以供打印。所以你可以覆盖 Date.prototype.toString
来改变打印的内容。演示(copy-pasted 来自 Chrome 控制台会话):
> var d = new Date()
> console.log(d)
< Sun May 19 2019 14:29:02 GMT+0200 (Central European Summer Time)
> Date.prototype.toString = Date.prototype.toLocaleString
< ƒ toLocaleString() { [native code] }
> console.log(d)
< 5/19/2019, 2:29:02 PM
> console.log({a:new Date()})
< {a: 5/19/2019, 2:31:21 PM}
另一个问题是 JSON.stringify({a: 1})
给出 {"a":1}
,而 console.log({a: 1})
输出 {a: 1}
(a
周围没有引号)。这与日期无关,是因为 JSON 是 JavaScript 的一个非常有限的子集({a: 1}
有效 JavaScript 但无效 JSON) .此外,console.log
是供人类使用的,不需要将输出解析回原始对象——只需考虑 console.log(new Array(100))
的作用:-)
编辑:以上内容适用于 Chrome。由于 console
对象未包含在 ECMAScript 规范中,因此每个嵌入者都可以提供他们认为在那里有用的任何内容。 Node.js uses util.format
, which in turn uses util.inspect
, which in turn gets the toISOString
function from the primordial Date.prototype
,这意味着你不能覆盖它(这是一个特性,因为这意味着你不能破坏它,或者是一个限制,因为它意味着你不能自定义它,取决于你的观点)。