Часть более крупной программы, использующей AngularJs, фрагмент кода:
var thePortList = $scope.ipPortList; // an array of objects
...
...
console.log("before", $scope.ipPortList, thePortList);
thePortList[i] = {};
console.log("after", $scope.ipPortList, thePortList);
Создает этот вывод:
before [] []
after [2: Object] [2: Object]
Понятия не имею почему. Я мог ожидать увидеть что-то подобное в многопоточной программе, но не в Javascript.
x = {} должен назначить новый пустой объект этому элементу массива. Правильно? Я смущен этим поведением. Может ли кто-нибудь пролить свет?
Протестировано в Chrome как на моей локальной машине, так и на plunkr.
Plunkr здесь:
Полный вывод консоли plunkr: Plunker Link
Event tracked Multipane Show Preview Toolbar undefined undefined
editor-0.11.1.js:2 URL visited /?p=preview
VM631:29 portList []
VM631:34 processing 0 [] undefined
VM631:39 skipping 0
VM631:34 processing 1 [] undefined
VM631:39 skipping 1
VM631:34 processing 2 [] undefined
VM631:45 before [] []
VM631:47 after [2: Object] [2: Object]
Это правильное поведение, я думаю, вы неправильно понимаете смысл информации журнала. Вы можете попробовать этот код в консоли и посмотреть результат:
var a=[];
a[2]={};
a
output: [undefined × 2, Object__proto__: Object]
Информация журнала консоли "[2: Объект]" опущена 2 неопределенной, в JavaScript, если вы присвоите значение элементу массива, который не соответствует его длине, вы получите неопределенное, если попытаетесь получить доступ к элементу от длины начала до индекса и это не потому, что массив автоматически заполняется undefined, потому что это стандартный ответ на доступ к несуществующему свойству. На самом деле ничего не изменилось, кроме длины массива.
undefined
чтобы заполнить пробел. То есть существует разница между отсутствующим элементом, у которого никогда не было значения, и элементом, которому явно было присвоено значение undefined
. (Но консоль позволяет узнать, сколько элементов не хватает.)
Array(2).forEach(i => console.log(i))
и [undefined, undefined].forEach(i => console.log(i))
выдают разные выходные данные. Один представляет собой пустой массив, длина которого была установлена на 2, другой представляет собой массив с 2 фактическими неопределенными в нем
$scope.ipPortList
и вthePortList
? Потому что это правильное поведение, учитывая, что оба ссылаются на один и тот же массив.