我已经在SO上阅读了this question,但是我在这里问为什么允许以下语义
采用以下Javascript示例:
window - window = NaN
window - document = NaN
但
new Date() - new Date() = 0
new Date / new Date() = 1
new Date * new Date() = 2.2659874948410516e+24
为什么这样做?这些代码段在Chrome控制台中执行,我对此处发生的事情有几个疑问:
首先,为什么在Javascript中甚至允许在Date上进行算术运算?它是一种特殊类型的物体,神奇地允许这些能力吗? Date甚至在内部被视为对象?为什么甚至强迫我们像普通对象一样创建一个Date()?
其次,减去或乘以两个日期甚至意味着什么?
第三,是Date唯一的例外,还是其他对象有这些“超级大国”(除了字符串),也可以在用户定义中复制代码?
答案 0 :(得分:2)
您可以自己实施(是超人!)。在对象上使用+*-/
尝试通过调用以下任一项将该对象转换为基元:
obj.toString() //if string is required
obj.valueOf() // if number is required
所以要做出这种行为,只需定义那些方法:
class one {
valueOf(){ return 1; }
}
alert( new one + new one)//2
答案 1 :(得分:1)
JS支持一种基本形式的运算符重载,以便算术运算符在应用于对象时,调用其特殊的a = {};
a.valueOf = () => 1;
b = {};
b.valueOf = () => 2;
console.log(a + b)
方法来获取数值:
Date

valueOf
个对象定义valueOf
,以便从纪元返回毫秒。
请注意- * /
仅在"数字"中调用。上下文,+
的情况,但不是Number
的情况。如果您要在日期中添加内容,请先转换为today = new Date
tomorrow = new Date(Number(today) + 24 * 3600 * 1000)
console.log(tomorrow)
:
{ a: ['name 1'], b: [[1,2,3]] }