Ссылка на JavaScript в цикле for-of - PullRequest
       5

Ссылка на JavaScript в цикле for-of

0 голосов
/ 04 сентября 2018

С помощью обычного цикла for я могу сделать что-то подобное:

for (let i = 0; i < objects.length; i++) {
    delete objects[i];
}

Это невозможно при обычном цикле for-of-loop

for (let o of objects) {
    delete o;
}

что сгенерирует такую ​​ошибку

SyntaxError: Удаление локальной переменной в строгом режиме.

И это ожидается, o является копией. Итак, есть ли способ инициализировать o как ссылку? Например, вот как это делается в C ++ 11:

for (auto &o : objects) {
    // o is a reference to an object from objects
}

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

delete никогда на самом деле не удалит базовый объект - если свойство объекта (или массива) является ссылкой на объект, например, с помощью objects[i], и вы удаляете свойство из объекта (который можно выполнить с помощью delete, например, delete objects[i]), тогда этот объект (objects[i]) все еще будет существовать в памяти (на данный момент). Он будет на самом деле удален только один раз ничто иное не может сослаться на него, и сборщик мусора запустится.

Например, со следующим кодом:

const obj = { foo: 'foo' };
const arr = [obj];

Ничто из того, что вы могли бы сделать arr не может отменить ссылку на объект, на который указывает obj. (Вы можете мутировать , например, for (const prop of arr[0]) delete arr[0][prop], но вы не можете удалить сам объект из памяти.)

Если на каждый объект в массиве нет ссылок где-либо еще, то способ отменить ссылку на все из них, чтобы они были GC'd, с помощью вашего исходного кода:

for (let i = 0; i < objects.length; i++) {
    delete objects[i];
}

или что-то в этом роде.

0 голосов
/ 04 сентября 2018

JavaScript не поддерживает delete, примененный к объектам - это синтаксическая ошибка, как опубликовано. Оператор удаления в JavaScript применяется только для удаления именованного свойства из объекта. Тип и значение свойства не имеют значения.

Следовательно

let a= [{}];
delete a[0];

удаляет свойство с именем «0» из a. Анонимный объект, который был сохранен в массиве, больше не имеет ссылок в коде и будет собираться GC.

Но

 let a = [{}];
 for (let o of a) {
    delete o;
 }

- это синтаксическая ошибка , сгенерированная неверным выражением delete - имя свойства не предусмотрено для удаления.

И это, как ожидается, o является копией.

может все еще намекает на C ++. Значения данных объекта в JavaScript являются ссылками на структуру данных объекта. Это может быть указатель памяти, но это будет полностью зависеть от движка JavaScript.

Язык не предоставляет средства доступа к внутреннему значению ссылки / указателя или выполнения каких-либо операций с адресами над ним. Скопированное значение объекта будет относиться к той же структуре данных, что и значение, из которого оно было скопировано.

Манипуляции со свойствами объекта могут быть выполнены с любой ссылкой или скопированной ссылкой на него. Также следует отметить, что объекты JavaScript не поддерживают деструкторы. Ресурсы памяти объекта могут быть восстановлены GC, когда никакой доступный код все еще не может получить к нему доступ.

0 голосов
/ 04 сентября 2018

Это можно сделать с помощью метода Array.prototype.forEach, который предоставляет элемент массива вместе с индексом элемента для функции итератора.

var arr = [1, 2, 3];

arr.forEach(function(item, index) {
  delete arr[index];
});
console.log(arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...