为什么对 JavaScript 日期对象 return 不同类型进行类似的数学运算?
Why do similar math operations on a JavaScript Date object return different types?
为什么会这样?
> new Date() - 50
1591281777205
> new Date() + 50
'Thu Jun 04 2020 10:43:01 GMT-0400 (Eastern Daylight Time)50'
console.log(new Date() - 50);
console.log(new Date() + 50);
我从技术角度对此感兴趣,但从语言设计的角度可能更感兴趣。这种行为是否有任何理由,或者仅仅是向后兼容性或历史原因的结果?在 JavaScript 的漫长而多风的道路上,是什么限制或不幸导致了这种疯狂?
因为 +
被重载为 mathematical add
或 string concatenation
。而 -
仅表示 mathematical subtract
。您可以通过在原型上实现 toPrimitive
函数来自行实现此行为。像这样:
function MyDate(n) {
this.number = n;
}
MyDate.prototype[Symbol.toPrimitive] = function(hint) {
if (hint === 'number') {
return this.number;
}
return `The date is: ${this.number}`;
};
var date = new MyDate(4);
console.log(date - 3);
console.log(date + 3);
在 Javascript 中,如果 + 运算符的左侧是字符串,JavaScript 会将右侧强制转换为 string.Its 也是 JavaScript 字符串也可用于添加(连接)字符串的运算符。
这就是为什么你会变成这样:
为什么会这样?
> new Date() - 50
1591281777205
> new Date() + 50
'Thu Jun 04 2020 10:43:01 GMT-0400 (Eastern Daylight Time)50'
console.log(new Date() - 50);
console.log(new Date() + 50);
我从技术角度对此感兴趣,但从语言设计的角度可能更感兴趣。这种行为是否有任何理由,或者仅仅是向后兼容性或历史原因的结果?在 JavaScript 的漫长而多风的道路上,是什么限制或不幸导致了这种疯狂?
因为 +
被重载为 mathematical add
或 string concatenation
。而 -
仅表示 mathematical subtract
。您可以通过在原型上实现 toPrimitive
函数来自行实现此行为。像这样:
function MyDate(n) {
this.number = n;
}
MyDate.prototype[Symbol.toPrimitive] = function(hint) {
if (hint === 'number') {
return this.number;
}
return `The date is: ${this.number}`;
};
var date = new MyDate(4);
console.log(date - 3);
console.log(date + 3);
在 Javascript 中,如果 + 运算符的左侧是字符串,JavaScript 会将右侧强制转换为 string.Its 也是 JavaScript 字符串也可用于添加(连接)字符串的运算符。
这就是为什么你会变成这样: