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

В чем разница между неинициализированными элементами в массиве в JavaScript и Java?

Я просто играл с JavaScript и застрял в простой программе.

Я объявлял массив в JavaScript, например

var a = [0, 1, 2];

Тогда, поскольку в JavaScript нет фиксированного размера для массива, и мы можем добавить больше к массиву, я добавил другое целое число в массив.

a[3] = 3;

И как ожидалось Если я попытаюсь получить доступ к a[4], я определенно собираюсь получить его как undefined.

Теперь, если я возьму массив

var a = [0,1,2];

И добавьте еще один элемент

a[4] = 4;

Я намеренно не определил a[3], и это также дает мне a[3] как undefined.

Вот сценарий, где это можно наблюдать: http://jsfiddle.net/ZUrvM/

Теперь, если я попытаюсь сделать то же самое в Java,

int[] a = new int[4];
a[0] = 0;
a[1] = 1;

a[3] = 3;

Затем я заканчиваю

a[2] = 0;

Вы можете видеть это на ideone: https://ideone.com/WKn6Rf

Причиной этого в Java я обнаружил, что четыре переменные определены при объявлении массива, и мы можем присваивать значения объявленному размеру массива. Но в JavaScript, когда я объявляю массив размером 3, а затем добавляю 5-й элемент, почему он не считает, что 4-й элемент будет null или 0, если мы увеличили размер массива выше 4?

Почему я вижу это странное поведение в JavaScript, но не на других языках?

4b9b3361

Ответ 1

Почему это странное поведение в JavaScript?

Поскольку массивы - это только объекты. Если вы получите доступ к несуществующему свойству, вернитесь undefined. Вы просто не назначали элемент в индексе 3, поэтому ничего нет.

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

Почему это странное поведение в Java/C/С++?

Поскольку массивы представляют собой фрагменты выделенной памяти, а при распределении массива размером 4 все его элементы принимают свои значения из этой ячейки памяти. Чтобы избежать неопределенных значений, на некоторых языках/случаях поля получают инициализацию по умолчанию, обычно с помощью 0.

Ответ 2

JavaScript не является строго типизированным языком.

В Java вы объявили массив целых чисел. Значение по умолчанию для любого элемента в этом массиве равно 0.

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

Ответ 3

Массив - это непрерывный набор данных. Скажем, если у вас есть значение в index 1 и index 10, остальное будет заполнено undefined.

Вы не можете создать массив с пустыми значениями. "Пустое в вашем смысле", не undefined или null, оно пусто:)

Эти непрерывные данные undefined означают назначение по умолчанию в JavaScript.

Скажем, если вы определили переменную,

var X;
console.log(X)    //Undefined

это не null. null - это пользователь, явно указывающий способ сообщить, что есть пустые данные, а undefined - механизм JavaScript.