2016-08-02 2 views
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'? Потому что это правильное поведение, учитывая, что оба относятся к одному и тому же массиву. – nnnnnn

+0

Можете ли вы рассказать нам, каково ваше ожидаемое поведение –

ответ

1

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

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

output: [undefined × 2, Object__proto__: Object] 

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

+2

* «если вы присвоите значение элементу массива, который из его длины не определен, он будет автоматически завершен до тех пор, пока индекс элемента« * - JS не создаст элементы со значением «undefined» 'чтобы заполнить пробел. То есть разница между отсутствующим элементом, который никогда не имел значения, и элементом, которому явно было присвоено значение 'undefined'. (Но консоль позволяет вам узнать, сколько элементов отсутствует.) – nnnnnn

+0

@nnnnnn интересное доказательство этого заключается в том, что 'Array (2) .forEach (i => console.log (i))' и '[undefined, undefined ] .forEach (i => console.log (i)) 'производить разные выходы. Один из них - пустой массив, длина которого установлена ​​равным 2, а другой - массив с 2 действительными неопределенными в нем. –

+0

@nnnnnn прав, я исправил ответ. – jarvanJiang

Смежные вопросы