Длина JavaScript не определена или ноль - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь написать функцию Javascript, которая возвращает один элемент с указанным именем.Я нашел этот вопрос и изменил ответ, чтобы использовать троичный оператор.

function getField(fieldName)
{
    var elements = document.getElementsByName(fieldName);

    return elements.length && elements.legth > 0 ? elements[0] : null;
}

Мой вопрос касается случая, когда document.getElementsByName(fieldName) не находит совпадений.Возвращает ли undefined или 0?Когда я вывожу elements.length в качестве предупреждающего сообщения, значение в предупреждении равно 0, но DevTools консоли Chrome сообщает undefined.Когда я звоню console.log(elements.length) с консоли, он выводит 0 и undefined.

My tests in Chrome

Я знаю, чтомоя функция обрабатывает любой случай, но чего мне здесь не хватает?Что на самом деле делает Javascript?

Заранее спасибо за помощь в понимании этого.

РЕДАКТИРОВАТЬ: Извините за публикацию изображения вместо реального кода и спасибо за разъяснение синтаксиса.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Поскольку ваш вопрос, кажется, что document.getElementsByName возвращается, когда он не найден, это будет пустой NodeList , с длиной 0 (поэтому не является неопределенным))

Поэтому проще всего было бы то, что Дандавис предложил в своем комментарии просто вернуть первый элемент списка узлов.Если оно пустое, оно будет неопределенным, если нет, то это будет первый элемент (хотя я не уверен, что оно всегда соответствует вашему случаю)

, поэтому ваша функция также может быть

function getFieldAt(fieldName, index = 0) {
  return document.getElementsByName(fieldName)[index];
}

если вы не используете необязательные параметры, вы можете изменить его на

function getFieldAt(fieldName, index) {
  return document.getElementsByName(fieldName)[index || 0];
}

Ваше недопонимание относительно devtools подробно объяснено в комментариях, а также в другом ответе:)

0 голосов
/ 19 февраля 2019

нет необходимости проверять значение длины, просто используйте:

function getField(fieldName)
{
  let elements = document.getElementsByName(fieldName);
  return (elements[0]) ? elements[0] : null;
}

console.log( getField('div-A') );
console.log( getField('neverExist') );
<div name="div-A"> div-A 1 </div>
<div name="div-A"> div-A 2 </div>
<div name="div-A"> div-A 3 </div>
0 голосов
/ 18 февраля 2019

elements.length в вашем случае равно 0.

Ваше понимание console.log вводит в заблуждение:

console.log(elements.length);
> elements.length is printed. It evaluates to 0, so 0 is printed
> console.log(elements.length). It evaluates to undefined, so undefined is printed.
...