簡體   English   中英

ES6 Spread運算符(靜態參數)-Safari 9語法失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM