如何在 IE11 中解决:对象不支持 属性 或方法 'padStart'

How to solve in IE11: Object doesn't support property or method 'padStart'

我有将时间间隔(总和和平均值)转换为 "hh:mm:ss" 格式的代码,在任何地方都很好,除了在 IE 11 中,我收到此错误:

SCRIPT438: Object doesn't support property or method 'padStart'

我如何重写这段代码才能正常工作?

var times = [3600000, 60000, 1000];

function formatTime(avg) {
    return times.map(function (t) {
        var value = Math.floor(avg / t);
        avg %= t;
        return value;
    }).map(function (v) {
        return v.toString().padStart(2, 0);
    }).join(':');
}

console.log(formatTime(32939000)); // 09:08:59

padStart(2, 0) 在最后一个 return 语句中被调用。我怎样才能让它在 IE11 中工作?

根据 padStart 的 MDN 文档,Internet Explorer 不支持该功能。但是,他们还提供了一个 polyfill,如果 padStart 缺失,它将添加。只需将代码块添加到程序的开头,您就会在 任何 浏览器中看到 padStart

// https://github.com/uxitten/polyfill/blob/master/string.polyfill.js
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
if (!String.prototype.padStart) {
    String.prototype.padStart = function padStart(targetLength, padString) {
        targetLength = targetLength >> 0; //truncate if number, or convert non-number to 0;
        padString = String(typeof padString !== 'undefined' ? padString : ' ');
        if (this.length >= targetLength) {
            return String(this);
        } else {
            targetLength = targetLength - this.length;
            if (targetLength > padString.length) {
                padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed
            }
            return padString.slice(0, targetLength) + String(this);
        }
    };
}

(根据 MDN's about page,前面的代码在 public 域中。)

对于您的具体案例——您正在处理具有 1 位或 2 位数字的时间部分(小时、分钟、秒)——您可以替换:

return v.toString().padStart(2, 0);

与:

return ("0" + v).slice(-2);

...为什么不在第一次迭代中这样做,这样您就可以避免额外的 map:

var times = [3600000, 60000, 1000];

function formatTime(avg) {
    return times.map(function (t) {
        var value = Math.floor(avg / t);
        avg %= t;
        return ("0" + value).slice(-2);
    }).join(':');
}

console.log(formatTime(32939000)); // 09:08:59

另一种方法是先进行连接,然后使用 \b\d\b 作为正则表达式来识别单个数字并使用 replace:

插入缺失的零
.join(':').replace(/\b\d\b/g, "0$&");

var times = [3600000, 60000, 1000];

function formatTime(avg) {
    return times.map(function (t) {
        var value = Math.floor(avg / t);
        avg %= t;
        return value;
    }).join(':').replace(/\b\d\b/g, "0$&");
}

console.log(formatTime(32939000)); // 09:08:59