অ্যারে রাজ্য আইওএস 12 সাফারিতে ক্যাশে হবে। এটি কোনও বাগ বা বৈশিষ্ট্য?


432

2018.10.31 এ আপডেট

এই বাগটি আইওএস 12.1 এ স্থির করা হয়েছে, দিনটি ভালো ~

সদ্য প্রকাশিত আইওএস 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>

পৃষ্ঠাটি রিফ্রেশ করার পরে, অ্যারের মানটি এখনও বিপরীত। এটি কি বাগ বা নতুন সাফারির বৈশিষ্ট্য?


এখানে একটি ডেমো পৃষ্ঠা। এটি আইওএস 12 সাফারি দিয়ে ব্যবহার করার চেষ্টা করুন: https://abelyao.github.io/others/ios12-safari-bug.html



43
সাফারি সংস্করণ 12.0 (13606.2.11) সহ ম্যাকোস 10.13.6 (উচ্চ সিয়েরা) একই সমস্যা রয়েছে। পৃষ্ঠাটি রিফ্রেশ করার পরেও অ্যারেটি বিপরীত।
কেভিন গিম্বেল

2
বাগটি সাফারি 12.0.1 (ম্যাকোএস), পাশাপাশি আইওএস 12.1 এ স্থির করা হয়েছে।
মিঃ মিস্টার

উত্তর:


272

এটি অবশ্যই একটি বিইউজি! এবং এটি একটি খুব গুরুতর বাগ।

বাগটি অ্যারে ইনিশিয়ালাইজারগুলির অপ্টিমাইজেশনের কারণে যা সমস্ত মান আদি আক্ষরিক হয়। উদাহরণস্বরূপ, ফাংশনটি দেওয়া:

function buildArray() {
    return [1, null, 'x'];
}

কল থেকে সমস্ত ফিরে আসা অ্যারের উল্লেখগুলি buildArray()একই মেমরির সাথে লিঙ্ক করবে এবং কিছু পদ্ধতি যেমন toString()তাদের ফলাফলগুলি ক্যাশে করবে। সাধারণত, ধারাবাহিকতা রক্ষার জন্য, এই ধরনের অনুকূলিত অ্যারেগুলির কোনও পরিবর্তনীয় ক্রিয়াকলাপ ডেটাটিকে একটি পৃথক মেমরি স্পেসে অনুলিপি করবে এবং এর সাথে লিঙ্ক করবে; এই নিদর্শনটিকে কপিরাইট অন-লিখন বা সংক্ষেপে CoW বলা হয়।

reverse()পদ্ধতি mutates অ্যারের, তাই এটি একটি কপি-অন-লেখ আরম্ভ করা উচিত নয়। তবে এটি হয় না, কারণ মূল পরীক্ষক (অ্যাপলের কেথ মিলার) reverse()মামলাটি মিস করেছেন , যদিও তিনি অনেকগুলি টেস্টকেস লিখেছিলেন।

এই বাগটি অ্যাপলকে 21 আগস্ট জানানো হয়েছিল। ফিক্সটি 27 আগস্ট ওয়েবকিট সংগ্রহস্থলে অবতরণ করে এবং সাফারি 12.0.1 এবং আইওএস 12.1 এ 30 ই অক্টোবর, 2018 এ পাঠানো হয়েছিল।


11
দ্রষ্টব্য: ম্যাক ওএস এক্সের সাফারি 12.0 এও একই সমস্যা রয়েছে।
hax

17
হ্যাঁ এটি ইতিমধ্যে উত্সগুলিতে স্থির করা হয়েছে এবং ইতিমধ্যে সাফারি প্রযুক্তি পূর্বরূপে প্রেরণ করা হয়েছে। সাফারি প্রযুক্তি প্রিভিউ 65 এ cdn.miss.cat/demo/ios12-safari-bug.html চেষ্টা করুন You আপনি দেখতে পাবেন যে এটিতে বাগ নেই।
sideshowbarker

6
আমি বিশ্বাস করি না যে বাগের অন্তর্নিহিত কারণটি সূচক মিক্সআপের ফলাফল; পরিবর্তে, মনে হয় এটি পরিবর্তন করার আগে কোনও বস্তু অপরিবর্তনীয় কিনা তা যাচাই করতে অবহেলা করার কারণে ঘটেছিল। স্লাইস ইস্যুটির অনুরূপ ব্যাখ্যা থাকতে পারে তবে এটি একই নয় তবে প্যাচ দ্বারা বিপরীতভাবে ঠিক করা হবে না, যতদূর আমি বলতে পারি। স্লাইস ইস্যুর জন্য আপনার ওয়েবকিট বাগ রিপোর্ট খোলার বিষয়টি বিবেচনা করা উচিত।
জেনেক্সার

5
@ জেনেক্সার আপনি ঠিক বলেছেন আমি এই উত্তরগুলি লিখেছিলাম bugs.webkit.org/show_bug.cgi?id=188794 খুঁজে পাওয়ার আগে এবং উত্স কোডটি দেখুন। আমি আমার উত্তর সম্পাদনা করব।
hax

75

আমি বাগটি ঠিক করার জন্য একটি lib লিখেছি। 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);
  }
})();


4
যে কোনও সময় আপডেট করুন। অবদান রাখতে স্বাগতম।
এডিয়ার ফ্যান 11

14
@ সাফি, আমি অনুমান করি যে দৈর্ঘ্যের উপর লেখা ( this.length = this.length) অনুলিপি করে অনুলিপি তৈরি করবে, সুতরাং অ্যারের মেমরি ঠিকানা পরিবর্তন করবে এবং এর আচরণ ঠিক করবে reverse
সিউর

14

এটি ওয়েবকিটের একটি বাগ । যদিও এটি তাদের শেষের দিকে সমাধান করা হয়েছে তবে আইওএস জিএম রিলিজের সাথে এখনও পাঠানো হয়নি। এই সমস্যার অন্যতম সমাধান:

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

6

উপাদানগুলির সংখ্যা পরিবর্তন হলে এটি ক্যাশে হবে না বলে মনে হয়।
আমি এটিকে এড়াতে সক্ষম হয়েছি।

<!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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.