Особенности массивов в JavaScript
- Каждый элемент может содержать данные любого типа, а размер массива можно динамически регулировать, то есть он может автоматически увеличиваться по мере добавления данных для размещения новых данных.
- В массиве могут быть пропуски
- разреженный массив
Массив с прерывистыми индексами, значение свойства длины которых больше, чем количество элементов.
- плотный массив
Массив с последовательными индексами, значение свойства длины которого равно количеству элементов.
В JavaScript массивы также по сути являются объектами, особой формой объектов.
Индексы массива на самом деле ничем не отличаются от свойств объектов, которые представляют собой целочисленные имена, но реализация массивов оптимизирована таким образом, что доступ к элементам массива через индексы массива происходит намного быстрее, чем доступ к свойствам обычных объектов.
Диапазон, определяющий индекс массива, равен0 ~ 4294967294 (2^32 - 2)
, Все индексы являются именами свойств, но только целые числа в этом диапазоне являются индексами массива, которые вызывают поведение, зависящее от массива.
Как создается массив
литерал массива
Это наиболее часто используемый и самый простой способ создания массивов.
const arr1 = []
Конструктор
При использовании конструктора для создания массива в случае только одного параметра будут возвращены разные результаты в зависимости от типа параметра.
// 注:这种方式创建的数组属于稀疏数组,每一项都是空位,下边会具体介绍稀疏数组。
// 请避免使用这样的方式创建数组。
const arr1 = Array(3) // [empty × 3]
const arr2 = Array('3') // ["3"]
метод()
Это новый метод в ES6, призванный компенсировать недостатки конструкторов. Нет никакой разницы в поведении создания в зависимости от типа параметра.
const arr1 = Array.of(3) // [3]
const arr2 = Array.of('3') // ['3']
метод из()
Новый метод в ES6. Основная цель этого метода — преобразовать объект, похожий на массив, в объект массива. Этот метод создания массива заданной длины будет работать хорошо.
const arr1 = Array.from({length: 3}) // [undefined, undefined, undefined]
разреженный массив
Разреженный массив — это массив с пустыми местами.Вот краткое введение:
Выявление вакансий в
Пустые биты не имеют значения и могут быть обнаружены с помощью оператора. Мы можем использовать в характере, чтобы обнаружить, является ли элемент в массиве пробел.
const a = [,,,] // [empty × 3]
0 in a // false
const b = [1,2,3]
0 in b //true
Операции, приводящие к разреженным массивам
- удалить оператор
Элементы массива можно удалять из массива с помощью оператора удаления, длина массива не меняется, но остается пустое место.
const b = [1,2,3]
delete b[0]
console.log(b) // [empty, 2, 3]
- Конструктор
const a = Array(3)
console.log(a) // [empty × 3]
- Опускать значения в литералах массива
[,,,] // [empty × 3]
- Указанный индекс массива больше, чем длина массива
const c = []
c[10] = 0;
console.log(c) // [empty × 10, 0]
- Указанная длина массива больше, чем текущая длина массива
const a = []
a.length = 10 // [empty × 10]
Мы должны стараться избегать создания и использования разреженных массивов в мирное время, потому что существует много несоответствий в обработке разреженных массивов в методах до ES6.
непоследовательность операций
Обработка вакансий в ES5 уже очень непоследовательна, и в большинстве случаев вакансии игнорируются.
- forEach(), filter(), reduce(), every() и some() пропускают пустые места.
- map() пропускает пустые биты, но сохраняет значение.
- join() и toString() обрабатывают пустые пространства как неопределенные, а undefined и null обрабатываются как пустые строки.
ES6 явно преобразует пустые места в undefined.
- Метод Array.from преобразует пустое пространство массива в неопределенное.
- Оператор распространения (...) также преобразует значение null в значение undefined.
- copyWithin() будет копировать вместе с пустыми битами.
- fill() обрабатывает пустые места как обычные позиции массива.
- Цикл for...of также перебирает пустые слоты.
- Записи (), ключи (), значение (), find () и findex () обрабатываются в неопределенное.
Ссылаться на:"Введение в ECMAScript 6" Руана Ифэна - Расширение массивов - Пробелы в массивах
Примечание. Несогласованность операций может иметь много неожиданных результатов, поэтому Wall Crack рекомендует не создавать и не использовать разреженные массивы.
Создание неопределенного массива фиксированной длины
Иногда нам все равно, каково содержимое массива, нам просто нужен реальный массив и возможность использовать методы массива.
Вы можете обратиться к следующим методам создания:
- Array.apply
// 这个方法也是将一个类数组对象转为数组对象。
// 在创建 undefined 值的数组时有些奇怪和繁琐,但是结果远比 Array(3) 更准确可靠。
Array.apply(null, {length: 4}) // [undefined, undefined, undefined, undefined]
- Array.from()
// 将类数组对象转换为数组对象
Array.from({length: 4}) // [undefined, undefined, undefined, undefined]
- спред оператор
[...Array(4)] // [undefined, undefined, undefined, undefined]
в общем
- Не создавайте и не используйте разреженные массивы
- избегать использования
Array
Конструктор создает массив - рекомендуемые литералы объектов,
of()
,from()
, оператор спреда...
создать массив
Ссылка на ссылку
"Введение в ECMAScript 6" Руана Ифэна - Расширение массивов - Пробелы в массивах