Подтвердить что ты не робот

Что такое "undefined x 1" в JavaScript?

Я делаю небольшие эксперименты на основе этой записи в блоге.

Я делаю это исследование в отладчике Google Chrome, и здесь идет сложная часть.

What the heck is this?!

Я получаю тот факт, что я не могу удалить локальные переменные (поскольку они не являются атрибутами объекта). Я получаю, что могу "зачитать" все параметры, переданные функции из массива с именем "arguments". Я даже понимаю, что я не могу удалить элемент массива, только достигните того, что array[0] имеет значение undefined.

Может кто-нибудь объяснить мне, что означает undefined x 1 во встроенном изображении?

И когда я перезаписываю функцию foo, чтобы вернуть arguments[0], тогда я получаю обычный и "нормальный" undefined.

Это только эксперимент, но кажется интересным, знает ли кто-нибудь, что означает undefined x 1?

4b9b3361

Ответ 1

Кажется, это новый способ Chrome отображать неинициализированные индексы в массивах (и объекты типа массива):

> Array(100)
[undefined × 100]

Это, безусловно, лучше, чем печать [undefined, undefined, undefined,...] или, как раньше.

Хотя, если есть только одно значение undefined, они могут отказаться от x 1.

Ответ 2

Google Chrome, кажется, предпочитает отображать разреженный массив, используя эту нотацию undefined x n. Он покажет [undefined, undefined], если это не разреженный массив:

var arr = new Array(2);
console.log(arr);

var arr2 = [];
arr2[3] = 123;
console.log(arr2);

var arr3 = [,,,];
console.log(arr3)

var arr4 = [,];
console.log(arr4)

var arr5 = [undefined, undefined]
console.log(arr5)

var arr6 = [undefined]
console.log(arr6)

arr1 to arr4 - все разреженные массивы, а arr5 и arr6 - нет. Chrome покажет их как:

[undefined × 2] 
[undefined × 3, 123] 
[undefined × 3] 
[undefined × 1] 
[undefined, undefined] 
[undefined] 

обратите внимание на [undefined x 1] для разреженного массива.

Так как вы удалили элемент, это: Если вы удалите элемент из массива, массив станет разреженным.

Ответ 3

Вот как это выглядит. Введите этот код в консоль chrome devtools: -

arr = new Array(4);
arr[2] = "adf";
console.log(arr);    // [undefined × 2, "adf", undefined × 1]

Посмотрите первые два последовательных "undefined", которые представлены * 2, чтобы показать, что есть два последовательных undefined там

Ответ 4

Более новые версии Chrome используют empty × вместо undefined ×, чтобы сделать разницу более четкой.

Например, ввод [, undefined] в консоли DevTools приводит к:

▶(2) [empty × 1, undefined]

и изучение ключей в:

▼(2) [empty × 1, undefined]
   1: undefined
   length: 2
  ▶__proto__: Array(0)

Ответ 5

Это случилось со мной. Откройте то же самое в другом браузере и выведите/запишите массив на консоль. Пока он работает как в crome, так и в firefox одинаково (как при доступе к элементам работает нормально, даже если на выходе есть undefinedx1), я считаю, что какая-то ошибка в Chrome не обновляет что-то внутренне. Вы можете проверить это следующим образом:

  • Я добавлял элементы в массив и запускал console.log() для регистрации элемента, чтобы проверить, был ли он undefined или нет. Все они были определены.
  • После нажатия() я зарегистрировал массив, и казалось, что когда это произошло, всегда было последним undefined x 1 в Chrome.
  • Затем я попытался выполнить регистрацию еще раз и позже, но с тем же результатом.
  • Однако, когда я обращался (ради вывода), элемент по его индексу, он возвращал правильное значение (смешно).
  • После этого я снова зарегистрировал массив и сказал, что последний индекс был undefined x 1 (тот самый, с которым я только что обращался напрямую с успехом!).
  • Затем я сделал цикл for в массиве, зарегистрировав или используя каждый элемент, все показалось прекрасным.
  • Затем еще один журнал в массиве, все еще неисправен.

    Код, который я изначально использую, имеет проверки для undefined, и они не запускались, но я видел все эти неопределенные значения в консоли, и это вызывало меня (не предназначено для каламбура).

Также стоит прочитать: Униализованные переменные в массиве при использовании только Array.push? Я тоже использую pop() в своем коде, и это разумное объяснение того, что журнал консоли фактически представляет собой другое состояние во времени (когда код "остановлен" ).