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)代码>值的类型
获取您的字符串
。。。我的猜测是,在这个过程的某个地方调用了(可能是隐式的)