如何在 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
我有将时间间隔(总和和平均值)转换为 "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