Вычислить .length до или в цикле javascript

Я слежу за оптимизацией и простым интеллектуальным ответом.

В javascript и в большинстве случаев вы говорите о цикле for.

Если найдешь в инете. Вы можете видеть, что многие люди говорят, что код менее эффективен

for(var i = 0; i < arr.length; i++) {

}

чем

var len = arr.length;

for(var i = 0; i < len; i++) {
}

Тогда я подумал об этом. Кажется уместным сказать это, потому что, если вы просто читаете код, вы будете говорить в первом коде каждый раз, когда вы заходите в цикл, вы хотите получить длину.

Поэтому я хотел бы ответить на это чем-нибудь практичным.

Если вы узнаете о javascript, все является объектом, поэтому вы «можете» использовать сеттер и получатель?

так что я пробую это

<!DOCTYPE html>
<html lang = "en">
<head>
  <meta charset = "UTF-8">
  <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
  <meta http-equiv = "X-UA-Compatible" content = "ie=edge">
  <title>Document</title>
</head>
<body>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <h1 class = "abc">Hello</h1>
  <script>

    var eles=document.getElementsByClassName('abc');

    var tmp = eles.prototype.length;

    Object.defineProperty(eles, 'length', {
      get: function(e) {
        console.info("je suis la", this);
        return tmp.call(this);
      }
    })


    var len = eles.length;
    // for(i=0; i < eles.length;i++){
    // }
  </script>
</body>
</html>

Но проблема, которую я обнаружил здесь, в банкомате, заключается в том, что я нахожусь в бесконечном цикле.

"простой интеллектуальный ответ" ???

Bergi 07.07.2018 11:53

«вы найдете в Интернете много людей, говорящих»… много всего. И многие из них устарели. Разместите ссылки там, где вы их нашли.

Bergi 07.07.2018 11:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
38
1

Ответы 1

Сначала на инстансе нет прототипа:

var tmp = eles.prototype.length;

prototype не существует на eles, а length не существует на прототипе, он существует только на самом экземпляре. И вы не можете получить ссылку на базовый геттер / сеттер, поскольку они полностью прозрачны. Однако вы могли:

 var number = eles.length;

А затем внутри геттера просто верните это число:

 return tmp;

Но это все равно плохо по трем причинам:

1) NodeLists являются динамическими, поэтому длина может меняться между ними, что приведет к превышению диапазона, а неожиданные ошибки - это плохо.

2) Вы убиваете каждую оптимизацию встраивания, которую раньше делал бы любой серьезный движок js. В большинстве браузеров for(const el of array) на самом деле намного быстрее, чем возиться с индексами.

3) Он ничего не меняет, так как поиск свойств выполняется медленно, а не сам получатель.

Я пытаюсь переформулировать то, что вы говорите. -1 думаю о статическом нодлисте. -2 меня устраивают индексы, но нет - 3 я согласен с геттером. Я хочу доказать, что длина вычисляется один раз в каждом цикле? даже если вы воспользуетесь 1-м или 2-м действием? И я не знаю, как это продемонстрировать

Florent Giraud 06.07.2018 23:52

и проблема того, что вы представляете, не работает в IE

Florent Giraud 07.07.2018 00:05

Другие вопросы по теме