我試圖理解這種行爲:爲什麼Date添加結果是字符串?
var d = new Date();
console.log(+d); // 1458049171381
console.log(1 + d); // '1Tue Mar 15 2016 09:39:31 GMT-0400 (EDT)'
與此相反:
var obj = {
valueOf: function() {
return 123;
}
};
console.log(+obj); // 123
console.log(1 + obj); // 124
爲什麼Date
相加結果以string
時Date.prototype.valueOf
返回number
?
這裏是Addition Operator's spec爲JavaScript的天真翻譯
function ToPrimitive(x) {
return x.valueOf();
}
function IsString(x) {
return typeof x === 'string';
}
function ToString(x) {
return x.toString();
}
function ToNumber(x) {
try {
return parseFloat(x);
} catch (e) {
return NaN;
}
}
function AdditionOperator(lval, rval) {
let lprim = ToPrimitive(lval);
let rprim = ToPrimitive(rval);
if (IsString(lprim) || IsString(rprim)) {
return ToString(lprim) + ToString(rprim);
} else {
return ToNumber(lprim) + ToNumber(rprim);
}
}
但是,如果我調用這個有Date
對象,它返回一個數值:
AdditionOperator(new Date(), 1) // 1458049347088
有人可以闡明一些輕這個?
你讀過注1嗎? – Hacketo
@Hacketo/facepalm ...我會接受你的答案,如果你發佈一個。 –
@iliacholy你我錯了,這是一種誤解。感謝這個例子。 –