При каком условии 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