javascript - IOS 12 सफारी में ऐरे स्टेट को कैश किया जाएगा। यह एक बग या सुविधा है?




safari ios12 (3)

मैंने बग को ठीक करने के लिए एक परिवाद लिखा था। https://www.npmjs.com/package/array-reverse-polyfill

यह कोड है :

(function() {
  function buggy() {
    var a = [1, 2];
    return String(a) === String(a.reverse());
  }
  if(!buggy()) return;
  var r = Array.prototype.reverse;
  Array.prototype.reverse = function reverse() {
    if (Array.isArray(this)) this.length = this.length;
    return r.call(this);
  }
})();

https://code.i-harness.com

2018.10.31 पर अपडेट करें

यह बग iOS 12.1 में तय किया गया है, एक अच्छा दिन है ~

मुझे नए जारी किए गए iOS 12 सफारी में ऐरे के मूल्य की स्थिति में एक समस्या मिली, उदाहरण के लिए, कोड इस तरह:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>iOS 12 Safari bugs</title>
    <script type="text/javascript">
    window.addEventListener("load", function ()
    {
        let arr = [1, 2, 3, 4, 5];
        alert(arr.join());

        document.querySelector("button").addEventListener("click", function ()
        {
            arr.reverse();
        });
    });
    </script>
</head>
<body>
    <button>Array.reverse()</button>
    <p style="color:red;">test: click button and refresh page, code:</p>
</body>
</html>

पृष्ठ को ताज़ा करने के बाद, सरणी का मान अभी भी उलटा है। क्या यह बग या नई सफारी की विशेषता है?

यहाँ एक डेमो पेज है। IOS 12 सफारी के साथ इसका उपयोग करने का प्रयास करें: https://abelyao.github.io/others/ios12-safari-bug.html


यह वेबकिट में एक बग है। हालांकि यह उनके अंत में हल किया गया है लेकिन अभी तक iOS जीएम रिलीज के साथ शिप नहीं किया गया है। इस समस्या के समाधान में से एक:

(function() {
  function getReverseStr() {
    return [1, 2].reverse();
  }

  var n1 = getReverseStr()[0];
  var n2 = getReverseStr()[0];
  // check if there is an issue
  if(n1 != n2) {
    var origReverseFunction = Array.prototype.reverse;
    Array.prototype.reverse = function() {
      var newArr = this.slice();
      // use original reverse function so that edge cases are taken care of
      origReverseFunction.apply(newArr, arguments);
      var that = this;
      // copy reversed array
      newArr.forEach(function(value, index) {
        that[index] = value;
      });
      return this;
    }
  }
})();

लगता है कि तत्वों की संख्या में परिवर्तन नहीं किया जाएगा।
मैं इस तरह से बचने में सक्षम था।

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>iOS 12 Safari bugs</title>
    <script type="text/javascript">
    window.addEventListener("load", function ()
    {
        let arr = [1, 2, 3, 4, 5];
        arr.push('');
        arr.pop();
        alert(arr.join());

        document.querySelector("button").addEventListener("click", function ()
        {
            arr.reverse();
        });
    });
    </script>
</head>
<body>
    <button>Array.reverse()</button>
    <p style="color:red;">test: click button and refresh page, code:</p>
</body>
</html>





ios12