[英]ES6 Spread operator (Rest Parameter) - syntax fails with Safari 9
更新: FelixKling正确地指出,我对术语“ spread operator
使用不正确,应为Rest Parameter
。 使用我链接到的兼容性表,它清楚地表明Safari 9不支持Rest Parameter
。阐明它是Rest Parameter
是解决此问题的真正答案(尽管如何重写函数的示例非常出色)。
我编写了一个javascript函数性能测试器,用于测试函数运行需要多长时间。 它使用ES6传播运算符(...),并且在Firefox中可以正常工作,但在Safari(版本9.1.2以下)中不能正常工作。 根据此兼容性图表 ,Safari 9的散布运算符得分为9/15,我认为这是Safari 9的缺点。是否有ES6重写方法,以便它可以与Safari 9一起使用(如果没有,为什么9/15中的“ 9”-我认为这意味着它必须在某些情况下有效)?
function timerTest(func, iterations, ...someData) {
if (typeof iterations == "undefined") {
iterations = 1;
}
var start = performance.now();
for (var i = 0; i < iterations; i++) {
func.apply(this, someData);
}
var funcName = /function ([^\(]+)/.exec(func.toString())[0];
v("Time to run " + funcName + " for " + iterations + " time(s): " + (performance.now() - start));
return performance.now() - start;
}
如何使用它的示例(在这种情况下,确定3种方法中的哪一种更快地测试元素是否已分配了类):
var e = document.getElementById("test");
timerTest(hasClass, 1000000, e, "x");
timerTest(hasClass2, 1000000, e, "x");
timerTest(hasClass3, 1000000, e, "x");
function hasClass(e, name) {
if (typeof e !== "undefined" && typeof e.className !== "undefined") {
return new RegExp('(\\s|^)' + name + '(\\s|$)').test(e.className);
}
return false;
}
function hasClass2(e, name) {
if (typeof e !== "undefined" && typeof e.className !== "undefined") {
return (' ' + e.className + ' ').indexOf(' ' + name + ' ') > -1;
}
return false;
}
function hasClass3(e, name) {
if (typeof e !== "undefined" && typeof e.classList !== "undefined") {
return e.classList.contains(name)
}
return false;
}
使用参数对象
// call your timerTest function
timerTest(hasClass, 1000000, e, "x");
function timerTest(func, iterations) {
if (typeof iterations == "undefined"){
iterations = 1;
}
var start = performance.now();
//Get parameters from arguments
var args = Array.prototype.slice.call(arguments, 2);
for (var i = 0; i < iterations; i++){
func.apply(this, args);
}
var funcName = /function ([^\(]+)/.exec(func.toString())[0];
v("Time to run " + funcName + " for " + iterations + " time(s): " + (performance.now() - start));
return performance.now() - start;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.