自动javascript类型强制

时间:2013-12-19 17:07:15

标签: javascript

这更像是一个关于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原生类型的内置功能?

*注意:我意识到这可能是“最糟糕的想法

2 个答案:

答案 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"