Ничего не происходит после удаления объекта из const WeakSet - PullRequest
0 голосов
/ 13 декабря 2018

Я попытался запустить этот код в консоли инструментов Chrome Developer, и все прошло гладко.Для меня это нелогично, так как когда вы устанавливаете объект на null, вы по сути удаляете его.Но const должен предотвратить его любое изменение.

   let obj1 = { id: 1};
   let obj2 = { id: 2};
   const ws = new WeakSet([obj1, obj2]);
   obj2 = null;

Это ожидаемое поведение, и я просто что-то не понимаю, или это проблема с консолью и сборкой мусора?

1 Ответ

0 голосов
/ 13 декабря 2018

Редактировать: const означает, что вы можете обновить значение того, к чему относится const, но вы не можете переназначить его ссылку на что-то другое

const obj={id:1}
 obj.id=2 //no problem
 obj={id:3}//TypeError: Assignment to constant variable

Я запустил ваш код в jsbin

let obj1 = { id: 1};
let obj2 = { id: 2};
const ws = new WeakSet([obj1, obj2]);


console.log(ws.has(obj2))
obj2 = null;
console.log(ws.has(obj2))

И вот вывод: true false

Это ожидаемое поведение, даже с const.Поскольку вы устанавливаете для obj2 значение null, а не присваиваете vue непосредственное назначение, то есть const.

Я смог добавить новый объект obj3 к ws, используя ws.add(obj3).Даже это верно. Однако ws=new Weakset([obj3]) сгенерирует исключение.

ES2015 const не означает, что значение является «постоянным» или неизменным.Значение const может определенно измениться.Ниже приведен совершенно корректный код ES2015, который не выдает исключение: const foo = {}; foo.bar = 42; console.log(foo.bar); // → 42 Единственное, что здесь является неизменным, - это привязка.const присваивает значение ({}) имени переменной (foo) и гарантирует, что связывание не произойдет.

Source

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...