Javascript instanceof在JSON.stringify()中的行为有什么不同?

Javascript instanceof在JSON.stringify()中的行为有什么不同?,javascript,json,decimal.js,Javascript,Json,Decimal.js,我正在节点中用于一些财务计算。我正在编写一个自定义函数,但是当我使用instanceof测试属性类型时,得到的结果与在replacer函数之外执行相同测试时不同 下面是一个可运行的示例: const myObj={ myNum:新的十进制数(0.3) }; //logs的属性“myNum”是十进制的:true log('属性“myNum”是十进制:',myObj.myNum instanceof Decimal); 常量替换器=(键,值)=>{ 如果(键=='myNum'){ //logs的属

我正在节点中用于一些财务计算。我正在编写一个自定义函数,但是当我使用
instanceof
测试属性类型时,得到的结果与在replacer函数之外执行相同测试时不同

下面是一个可运行的示例:

const myObj={
myNum:新的十进制数(0.3)
};
//logs的属性“myNum”是十进制的:true
log('属性“myNum”是十进制:',myObj.myNum instanceof Decimal);
常量替换器=(键,值)=>{
如果(键=='myNum'){
//logs的属性“myNum”是十进制:false
log('属性“myNum”是十进制:',值instanceof Decimal);
}
if(十进制值实例){
返回值。toNumber()
}否则{
返回值;
}
}
stringify(myObj,replacer,4)

找到了答案。
Decimal
实例包括一个
.toJSON()
方法。当
JSON.stringify
遇到定义
toJSON
函数的对象时,它调用该函数并将结果作为替换函数中的第二个参数而不是对象引用返回。因此,上面示例中的
变量指向的是
字符串
,而不是
十进制
实例

来自MDN:

如果正在序列化的对象有一个名为
toJSON
的属性,其值是一个函数,那么
toJSON()
方法会自定义JSON字符串化行为:调用
toJSON()
方法时返回的值将被序列化,而不是序列化的对象

为了演示这一点,我可以调整上面的第二个示例,使其包含一个
toJSON
函数:

函数MyClass(){
//向我的自定义类添加一个toJSON方法
this.toJSON=()=>{
返回“你好,世界!”;
};
};
常数myObj={
myClass:新的myClass()
};
//日志的属性“myClass”是myClass:true
log('属性“myClass”是myClass:',myClass的MyBj.myClass实例);
常量替换器=(键,值)=>{
如果(键=='myClass'){
//日志的属性“myClass”是myClass:true
log('属性“myClass”是myClass:',myClass的值instanceof);
}
返回值;
}

stringify(myObj,replacer,4)
值的类型
获取您的
字符串
。。。我的猜测是,在这个过程的某个地方调用了(可能是隐式的)