Клавиша / esc

.length

Свойство, которое возвращает количество элементов в массиве.

Время чтения: меньше 5 мин

Кратко

Скопировано

Свойство length возвращает количество элементов в массиве. Если элементов нет, то свойство возвращает 0.

Пример

Скопировано
        
          
          const series = ['Кремниевая долина', 'Игра престолов', 'Рик и Морти', 'Гравити Фолс']console.log(series.length)// 4const empty = []console.log(empty.length)// 0
          const series = ['Кремниевая долина', 'Игра престолов', 'Рик и Морти', 'Гравити Фолс']
console.log(series.length)
// 4

const empty = []
console.log(empty.length)
// 0

        
        
          
        
      

Как понять

Скопировано

Свойство length хранит количество ячеек в массиве. Строго говоря, количество ячеек может быть больше, чем количество элементов в массиве, но на практике они почти всегда совпадают.

Значение свойства length — целое положительное число в диапазоне от 0 до 232.

Запись в свойство length

Скопировано

Свойство length перезаписываемое, вы можете записать в него любое число из диапазона возможных значений. Это изменит количество ячеек массива.

Если уменьшить значение свойства length, то из конца массива будут отброшены элементы, которые не входят в новый размер массива:

        
          
          const series = ['Кремниевая долина', 'Игра престолов', 'Рик и Морти', 'Гравити Фолс']console.log(series.length)// 4series.length = 2console.log(series)// ['Кремниевая долина', 'Игра престолов']
          const series = ['Кремниевая долина', 'Игра престолов', 'Рик и Морти', 'Гравити Фолс']
console.log(series.length)
// 4

series.length = 2
console.log(series)
// ['Кремниевая долина', 'Игра престолов']

        
        
          
        
      

Если увеличить значение свойства length, то в конец массива добавятся пустые ячейки. Значение в них не будет установлено и они будут игнорироваться при обходе:

        
          
          const todos = ['купить молока', 'почитать Доку']console.log(todos.length)// 2todos.length = 4console.log(todos)// ['купить молока', 'почитать Доку', <2 пустых ячейки>]todos.forEach(function(todo, index) {  console.log(`${index + 1}. ${todo}`)})// 1. купить молока// 2. почитать Доку
          const todos = ['купить молока', 'почитать Доку']
console.log(todos.length)
// 2

todos.length = 4
console.log(todos)
// ['купить молока', 'почитать Доку', <2 пустых ячейки>]

todos.forEach(function(todo, index) {
  console.log(`${index + 1}. ${todo}`)
})
// 1. купить молока
// 2. почитать Доку

        
        
          
        
      

Случаи, когда length не совпадает с количеством элементов в массиве

Скопировано

Корректнее всего говорить, что свойство length хранит количество ячеек доступных для записи в массиве, а не количество элементов. Они почти всегда совпадают, но есть случаи, когда в массиве больше ячеек, чем значений. Разберём эти случаи.

1️⃣ При создании пустого массива с помощью конструктора new Array() можно указать количество ячеек в массиве. Тогда количество ячеек и количество элементов не будут совпадать:

        
          
          const emptyArray = new Array(100)console.log(emptyArray.length)// 100
          const emptyArray = new Array(100)
console.log(emptyArray.length)
// 100

        
        
          
        
      

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

        
          
          const anotherEmptyArray = []console.log(anotherEmptyArray.length)// 0
          const anotherEmptyArray = []
console.log(anotherEmptyArray.length)
// 0

        
        
          
        
      

2️⃣ При записи нового элемента в индекс далеко за пределами массива. В этом случае между последним элементом и новым появляется «дыра» из пустых ячеек:

        
          
          const priorities = ['спать', 'есть', 'пить']console.log(priorities.length)// 3priorities[999] = 'работать'console.log(priorities.length)// 1000console.log(priorities)// ['спать', 'есть', 'пить', <996 пустых ячейки>, 'работать']
          const priorities = ['спать', 'есть', 'пить']
console.log(priorities.length)
// 3

priorities[999] = 'работать'
console.log(priorities.length)
// 1000
console.log(priorities)
// ['спать', 'есть', 'пить', <996 пустых ячейки>, 'работать']

        
        
          
        
      

3️⃣ При ручном увеличении значения свойства length:

        
          
          const todos = ['купить молока', 'почитать Доку']console.log(todos.length)// 2todos.length = 4console.log(todos)// ['купить молока', 'почитать Доку', <2 пустых ячейки>]
          const todos = ['купить молока', 'почитать Доку']
console.log(todos.length)
// 2

todos.length = 4
console.log(todos)
// ['купить молока', 'почитать Доку', <2 пустых ячейки>]

        
        
          
        
      

На практике

Скопировано

Николай Лопин советует

Скопировано

🛠 Свойство length используется при обходе массивов с помощью классических циклов for или while. На практике такие циклы уже встречаются редко, но это идиоматический код, который нужно знать. Если применить length неправильно, то можно перебрать не все элементы или сделать бесконечный цикл.

Классический код, который напечатает все элементы массива:

        
          
          const movies = ['Good Will Hunting', 'Raining Man', 'Beautiful Mind']for (let i = 0; i < movies.length; i++) {  console.log(movies[i])}
          const movies = ['Good Will Hunting', 'Raining Man', 'Beautiful Mind']
for (let i = 0; i < movies.length; i++) {
  console.log(movies[i])
}

        
        
          
        
      

🛠 Чаще всего к свойству обращаются, когда хотят проверить, пустой массив или нет:

        
          
          const movies = []if (movies.length === 0) {  console.log('Вы посмотрели все фильмы!')}
          const movies = []

if (movies.length === 0) {
  console.log('Вы посмотрели все фильмы!')
}

        
        
          
        
      

🛠 Не записывайте вручную значения в length. Хотя это и возможно, на практике такой код плохо читается. Он может неприятно удивить других разработчиков из-за того, что изменяет размер массива. Об этом побочном эффекте знают не все.