При каком условии Array.observe "добавить" триггер события?

Я узнаю о наблюдении объектов Array. Я обнаружил следующее:

var fooArray = [];
Array.observe(fooArray, function(changes){
    console.log('changes:', changes[0].type);
});
fooArray.push({});

приводит к типу изменения splice, а не add

Какие методы приведут к событию изменения типа add? Мне показалось, что одним из наиболее вероятных сценариев будет то, что нажатие на него одной ценности.

Ответ 1

ссылка MDN неясно, в каких обстоятельствах срабатывает каждый тип изменения. Вот подробное объяснение:

сплайсинга

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

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()

Обновление

Триггеры, если изменяется значение какого-либо элемента:

var arr = ['a', 'b', 'c'];
Array.observe(arr, function (changes) {
    console.dir(changes);
});
arr[0] = 'A'; // triggers 'update'

Стоит отметить, что некоторые функции массива могут также запускать его, например reverse().

добавить | удалить

Как неинтуитивно, как кажется, эти типы запускаются, когда свойство добавляется/удаляется из массива. Например:

var arr = ['a', 'b', 'c'];
Array.observe(arr, function (changes) {
    console.dir(changes);
});
arr.foo = 'bar'; // triggers 'add'
delete arr.foo;  // triggers 'delete'

P.S.: Смотрите ответ Джека о том, почему он ведет себя так.

Ответ 2

Наблюдатель изменений фактически реализован в Object, из которого наследуется Array. Вы можете получить ожидаемое поведение, если вместо Object.observe():

var arr = [];
Object.observe(arr, function(changes) {
  console.log(changes)
});
arr.push({});

Ответ 3

В дополнение к настройке настраиваемых свойств, таких как arr.b = 1, также возможно, по крайней мере, в настоящее время использовать V8 в Node, Opera или Chrome, чтобы инициировать "добавить" изменения в Array, используя:

arr = []
arr[1] = 1 // "splice" change
arr[0] = 1 // "add" change