Javascript JS valueOf和toString
在Javascript JS valueOf和toString,javascript,tostring,Javascript,Tostring,在x中正在进行的魔法是什么,而在y中没有 var x = new Date; var y = { toString: function() { return x.toString(); }, valueOf: function() { return x.valueOf(); } }; String(x) // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)" String(y) // "Mon M
x
中正在进行的魔法是什么,而在y
中没有
var x = new Date;
var y = {
toString: function() {
return x.toString();
},
valueOf: function() {
return x.valueOf();
}
};
String(x) // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)"
String(y) // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)"
'' + x // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)"
'' + y // "1427135200422"
我是否正确地认为x
有一个primative值ToString
s作为日期字符串,但是y
没有primative值
编辑:
为了实现它的价值,以下工作(此处为ES6)是否有效:
根据规范第8.12.8节: 当在没有提示的情况下调用O的[[DefaultValue]]内部方法时,它的行为就像提示是数字一样,除非O是日期对象(参见15.9.6),在这种情况下,它的行为就像提示是字符串一样
+
操作符传递“PreferredType”提示,其行为就像没有提示一样(尽管规范没有很好地解释这一点,或者如果有,我找不到)。因此,您的x
对象“首选”其字符串表示,而y
对象使用数字表示。中定义了+
的行为
生产AdditiveExpression:AdditiveExpression+
乘法表达式的计算方法如下:
- ToPrimitive为
返回x
,因为x.toString()
是一个日期对象,所以它就像提示是字符串一样x
- ToPrimitive为
返回y
,因为y.valueOf()
是一个非日期的本机对象,所以它就像提示是数字一样y
因此,加法运算符返回不同的结果。它仅在加法运算符步骤之后的“注释1”中明确表示:“在步骤5和6中对TopPrimitive的调用中未提供任何提示。”奇怪
0+x
给出一个字符串,0-x
给出一个数字。@apsillers啊,好的;我在查看[[ToPrimitive]]
部分的图表。@user2195592这是因为+
操作符和-
操作符有不同的行为。+
操作符兼作字符串连接操作符,而-
操作符总是数字减法。等等,为什么它是x.toString()
?@user2195592,因为x
是一个日期实例,这就是规范在注释1
中所说的。我现在明白了。谢谢
var y = {
[Symbol.toPrimitive](...args) {
return x[Symbol.toPrimitive](...args);
}
};