JSON.stringify 如何自动将 moment 对象转换为 iso 字符串?

How does JSON.stringify automagically convert moment objects to iso strings?

我很好奇像 moment 这样的库如何在对象上调用 JSON.stringify 时自动从对象转换为字符串。

即时示例测试:https://github.com/moment/moment/blob/3147fbc486209f0b479dc0b29672d4c2ef39cf43/src/test/moment/format.js#L144-L146

这是一些示例代码,我很好奇它是如何工作的

const moment = require('moment');
const duration = moment.duration(1374);
console.log('duration = ', duration); // Prints a duration object
console.log('JSON.stringify(duration) = ', JSON.stringify(duration)); // Prints a string such as `P0D1T0H3` <-- Note: Not exact value, just similar format

如果对象具有 .toJSON() 方法,JSON.stringify() 将在尝试对该对象执行自己的操作之前调用该方法。

日期对象,显然是 Moment 包装器对象,有 .toJSON() 调用 .toISOString()

来自MDN

If the value has a toJSON() method, it's responsible to define what data will be serialized.

来自moment

proto.toJSON         = toISOString;