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
具有ToString
作为日期字符串的主要价值,但y
没有主要价值?
编辑:
对于它的价值,以下工作(ES6在这里):
var y = {
[Symbol.toPrimitive](...args) {
return x[Symbol.toPrimitive](...args);
}
};
答案 0 :(得分:3)
来自规范的第8.12.8节:
当没有提示调用O的[[DefaultValue]]内部方法时,它的行为就好像提示是Number,除非O是Date对象(见15.9.6),在这种情况下它的行为就好像提示是String。
+
运算符传递“PreferredType”提示,其行为就像没有提示一样(虽然规范不能很好地解释,或者如果它没有,我找不到它)。因此,x
对象“更喜欢”其字符串表示,而y
对象使用数字表示。
答案 1 :(得分:2)
+
的行为在
11.6.1 The Addition operator ( + )
生产 AdditiveExpression : AdditiveExpression
+
MultiplicativeExpression 评估如下:
- 让 lref 成为评估AdditiveExpression的结果。
- 让 lval 为GetValue( lref )。
- 让 rref 成为评估MultiplicativeExpression的结果。
- 让 rval 为GetValue( rref )。
- 让 lprim 为ToPrimitive( lval )。
- 让 rprim 为ToPrimitive( rval )。
- 如果Type( lprim )是字符串或Type( rprim )是字符串,那么
- 将添加操作的结果返回到ToNumber( lprim )和ToNumber( rprim )。请参阅下面的注释11.6.3。
醇>注1 - 在步骤5中对ToPrimitive的调用中未提供任何提示 6.除Date对象之外的所有本机ECMAScript对象都处理 没有提示,好像给出了提示号;日期对象 处理没有提示,就好像给出了提示字符串一样。主办 对象可能会以其他方式处理缺少提示。
因此,根据ToPrimitive和[[DefaultValue]]的定义,
ToPrimitive为x.toString()
返回x
,因为x
是一个Date对象,所以它就像提示一样是String。
ToPrimitive为y.valueOf()
返回y
,因为y
是非Date本机对象,所以它的提示类似于数字。
因此,加法运算符返回不同的结果。