首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6扩展操作符(Rest参数)-SAFARI9语法失败

ES6扩展操作符(Rest参数)-SAFARI9语法失败
EN

Stack Overflow用户
提问于 2017-01-03 03:06:05
回答 1查看 1.3K关注 0票数 1

更新: 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“--我认为这意味着它在某些情况下一定有效)?

代码语言:javascript
复制
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种方法中哪一种方法测试元素是否分配了类更快):

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-03 03:21:17

使用参数对象

代码语言:javascript
复制
// call your timerTest function
timerTest(hasClass, 1000000, e, "x");
代码语言:javascript
复制
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;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41435854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档