我有这个JavaScript代码来格式化美元的数字,这个数字在Stackoverflow上得到了很多赞许。它在最新的Web浏览器中运行良好,但它会导致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行上提交的表单的预期Object。如果我删除上面的函数并让它传递数字而不格式化它在IE7中工作。它还抱怨从第一个“返回”开始的行。我已经从JavaScript中删除了其他所有内容,而这个功能是它出现的罪魁祸首。
答案 0 :(得分: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
} varient)。