x = {} создает спонтанный объект

0

Часть более крупной программы, использующей 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]
  • 3
    Каков ваш ожидаемый результат? Проблема в том, что объект появляется как в $scope.ipPortList и в thePortList ? Потому что это правильное поведение, учитывая, что оба ссылаются на один и тот же массив.
  • 0
    Можете ли вы сказать нам, что вы ожидали
Теги:

1 ответ

1
Лучший ответ

Это правильное поведение, я думаю, вы неправильно понимаете смысл информации журнала. Вы можете попробовать этот код в консоли и посмотреть результат:

var a=[];
a[2]={};
a

output: [undefined × 2, Object__proto__: Object]

Информация журнала консоли "[2: Объект]" опущена 2 неопределенной, в JavaScript, если вы присвоите значение элементу массива, который не соответствует его длине, вы получите неопределенное, если попытаетесь получить доступ к элементу от длины начала до индекса и это не потому, что массив автоматически заполняется undefined, потому что это стандартный ответ на доступ к несуществующему свойству. На самом деле ничего не изменилось, кроме длины массива.

  • 2
    «если вы присваиваете элементу массива значение, которое по его длине, undefined будет автоматически завершено до индекса элемента» - JS не создает элементы со значением undefined чтобы заполнить пробел. То есть существует разница между отсутствующим элементом, у которого никогда не было значения, и элементом, которому явно было присвоено значение undefined . (Но консоль позволяет узнать, сколько элементов не хватает.)
  • 0
    @nnnnnn интересным доказательством этого является то, что Array(2).forEach(i => console.log(i)) и [undefined, undefined].forEach(i => console.log(i)) выдают разные выходные данные. Один представляет собой пустой массив, длина которого была установлена на 2, другой представляет собой массив с 2 фактическими неопределенными в нем
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню