В других словах
document.querySelector()
выбирает только первый элемент указанного селектора. Поэтому он не выплевывает массив, это одно значение. Подобно document.getElementById()
, который извлекает только ID-элементы, поскольку идентификаторы должны быть уникальными. document.querySelectorAll()
выбирает все элементы с указанным селектором и возвращает их в массиве. Похоже на document.getElementsByClassName()
только для классов и document.getElementsByTagName()
.
Зачем использовать querySelector?
Используется просто для единственной цели легкость и краткость.
Зачем использовать getElement / sBy? *
Более быстрая производительность.
Почему это различие в производительности?
Оба способа выбора имеют целью создание NodeList для дальнейшего использования. querySelectors генерирует статический NodeList с селекторами, поэтому он должен быть сначала создан с нуля. getElement / sBy * немедленно адаптирует существующий живой NodeList текущего DOM.
Итак, когда использовать какой метод зависит от вас / вашего проекта / вашего устройства.
Infos
Демонстрация всех методов Документация NodeList Тест производительности
Потому что это локальная переменная. Вот почему ему ничего не назначено:
Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.
blockquote>Изменить: почему Java вызывает эту ошибку компиляции? Если мы посмотрим на файл класса
IdentifierExpression.java
, мы найдем этот блок:... if (field.isLocal()) { LocalMember local = (LocalMember)field; if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) { env.error(where, "invalid.uplevel", id); } if (!vset.testVar(local.number)) { env.error(where, "var.not.initialized", id); vset.addVar(local.number); } local.readcount++; } ...
Как указано (
if (!vset.testVar(local.number)) {
), JDK проверяет (сtestVar
), если переменная назначена (исходный кодVset
, где мы можем найти кодtestVar
). Если нет, он вызывает ошибкуvar.not.initialized
из файла свойств :... javac.err.var.not.initialized=\ Variable {0} may not have been initialized. ...
Поля классов (не final
в любом случае) инициализируются значениями по умолчанию. Локальные переменные не являются.
Не всегда необходимо назначать значение при объявлении поля. Поля, объявленные, но не инициализированные, будут установлены на разумный по умолчанию компилятор.
blockquote>Итак, поле (не
final
), подобноеf
вclass C { float f; }
, будет инициализировано
0f
, но локальная переменнаяf
вvoid myMethod() { float f; }
не будет.
Локальные переменные обрабатываются иначе, чем поля. Локальные переменные имеют ограниченное время жизни, поэтому любое использование перед инициализацией, вероятно, является ошибкой. Поля не так часто инициализируются по умолчанию.
Фактически, компилятор не присваивает значение по умолчанию вашему float f
, потому что в этом случае это локальная переменная, а не поле:
Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.
blockquote>
Привет, ребята, решение прост. значения, которые хранятся в памяти кучи, инициализируются типом данных на основе компилятора, но локальные переменные хранятся в стеке памяти, поэтому мы должны их инициализировать.