ES6 Spread运算符(Rest Parameter) - Safari 9的语法失败

时间:2017-01-03 03:06:05

标签: javascript safari ecmascript-6 spread-syntax

更新:FelixKling正确地指出我对spread operator一词的使用不正确,应该是Rest Parameter。使用我链接的兼容性表,它清楚地表明Safari 9中不支持Rest Parameter。澄清它是Rest Parameter是这个问题的真正答案(尽管如何重写的例子功能非常好。)

我编写了一个javascript函数性能测试程序,用于测试函数运行的时间。它使用ES6扩展运算符(...),它在Firefox中运行良好,但在Safari中运行良好(最高版本为9.1.2)。根据这个compatibility chart,Safari 9获得了扩展运算符9/15的分数,我认为这是Safari 9的缺点。是否有ES6方式重写它以便它可以与Safari 9一起使用(和如果没有,为什么" 9"在9/15 - 我认为这意味着它必定在某些情况下有效?)

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;
}

1 个答案:

答案 0 :(得分:-1)

使用arguments对象

// 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;
}