Что такое "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
?
Ответы
Ответ 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() в своем коде, и это разумное объяснение того, что журнал консоли фактически представляет собой другое состояние во времени (когда код "остановлен" ).