这更像是一个关于javascript如何工作的思考,而不是修复的实际问题。对于像
这样的陈述var str = 9 + " some words here";
结果str var将包含值“9 some words here”。我的问题是javascript使用什么函数来自动将Number对象'9'强制转换为字符串,以便与String对象“这里的一些单词”连接,并且这个函数是可更改/可重写的。
这开始于我需要在页面上输出前一个0的单个数字。这很容易通过Number对象
上的快速原型函数来完成Number.prototype.SpecialFormat = function() {
if(this < 10) {
return "0" + this;
}
else {
return this.toString();
}
};
并使用简单的(9).SpecialFormat() + " words here";
但是这让我想知道我是否可以使用
覆盖数字上的toString函数Number.prototype.toString = function() {
if(this < 10) {
return "0" + this;
}
else {
return this;
}
};
,只是让javascripts自动转换为我处理它,所以我可以使用标准9 + " words here";
来获得相同的结果“09 words here”。这不仅仅是隐含的工作,我不得不最终将.toString添加到9 (9).toString() + " words here"
(进一步看,会导致一些无限循环)。
那么有没有办法覆盖javascript原生类型的内置功能?
*注意:我意识到这可能是“最糟糕的想法”
答案 0 :(得分:3)
addition operator强制其在步骤7中对字符串的参数:
- 如果Type(lprim)是String或Type(rprim)是String,那么
- 返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串
ToString operation对数字有特殊规则,详见“ToString Applied to the Number Type”。
抽象操作ToString(number)
似乎永远不会使用Number.prototype.toString
。实际上,反之亦然:default Number.prototype.toString
function采用抽象数字ToString算法。因此,在ECMAScript 5中的类型强制期间,不可能覆盖数字字符串化的默认行为,因为无法改变语言定义的ToString操作。
ToString 在将对象强制转换为字符串时使用目标的toString
方法,而不是数字原始值。
答案 1 :(得分:3)
(不是严格意义上的答案,但我需要一些空间)
对类型强制非常小心,特别是在将原始类型与其对象组合时,因为:
var n = 9;
typeof n; // "number"
n instanceof Number; // false!!
n = new Number(9);
n instanceof Number; // true, oh thank God
typeof n; // "object" what!!
此外,toString
上的Number
实际上无效:
Number.prototype.toString = function () { return "foo" + this; };
var n = new Number(9);
"" + n; // "9", not "foo9"
避免这种混乱的方法是:
var ns = {
number: {
specialFormat: function () /* .. */ }
}
}
ns.number.specialFormat(9); // "09"