1

我有这个 JavaScript 代码来格式化一个美元的数字,在 Stackoverflow 上得到了很多赞许。它在最新的网络浏览器中运行良好,但它会导致 JavaScript 在 IE7 中失败。我试图使用不需要 JQuery 的函数,因为该项目的其余部分没有使用它:

 function formatDollar(num) {
     var p = num.toFixed(2).split(".");
     return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
         return  num + (i && !(i % 3) ? "," : "") + acc;
     }, "") + "." + p[1];
 }

IE7 对用户简单地说“页面错误”。在 IE7 的调试模式下,抱怨它不是在 On Click 行上提交的表单的预期对象。如果我删除上述函数并让它传递数字而不格式化它在 IE7 中工作。它还抱怨以第一个“返回”开头的行。我已经从 JavaScript 中删除了所有其他内容,而这个函数是它出现的罪魁祸首。

4

1 回答 1

4

reduce功能仅适用于 JavaScript 1.8 (ECMAScript 5) 及更高版本,IE7 未实现。如果您还没有使用任何提供跨浏览器功能的库,则可以这样实现:

if (!Array.prototype.reduce) {  
  Array.prototype.reduce = function reduce(accumulator){  
    if (this===null || this===undefined) throw new TypeError("Object is null or undefined");  
    var i = 0, l = this.length >> 0, curr;  

    if(typeof accumulator !== "function") // ES5 : "If IsCallable(callbackfn) is false, throw a TypeError exception."  
      throw new TypeError("First argument is not callable");  

    if(arguments.length < 2) {  
      if (l === 0) throw new TypeError("Array length is 0 and no second argument");  
      curr = this[0];  
      i = 1; // start accumulating at the second element  
    }  
    else  
      curr = arguments[1];  

    while (i < l) {  
      if(i in this) curr = accumulator.call(undefined, curr, this[i], i, this);  
      ++i;  
    }  

    return curr;  
  };  
}  

或者,如果您不介意不使用 的简化语法reduce,只需在函数中将其替换为等效循环(例如while上面的循环或变体for)。

参考

于 2012-08-03T08:41:12.317 回答