1

更新:spread operator FelixKling は、私の用語の使用が正しくなく、正しくあるべきであると正しく指摘していますRest Parameter。私がリンクした互換性表を使用するとRest Parameter、Safari 9 で がサポートされていないことが明確に示されて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;
}
4

1 に答える 1

-1

引数オブジェクトを使用

// 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;
}
于 2017-01-03T03:21:17.417 に答える