В javascript, как «for .. in» заявление может иметь побочный эффект? - PullRequest
3 голосов
/ 07 марта 2019

Я хочу знать, как for .. in может иметь любой побочный эффект?

let arr = [1.1, 2.2];
let obj = {x: 1, y: 1, z: 1};
for(let prop in obj) {
    ...
}

Учитывая приведенный выше фрагмент кода, возможно ли изменить некоторые элементы в arr при for .. in, а не в теле цикла?

В настоящее время я анализирую JIT-компилятор JavaScriptCore, DFG предполагает, что GetPropertyEnumerator имеет побочный эффект, и я понимаю, что он может изменить какой-то другой объект в операторе for .. in.
Но я не знаю, как это возможно.
Поэтому я хочу, чтобы это было возможно и, если возможно, как я мог это сделать.

1 Ответ

1 голос
/ 07 марта 2019

Я нашел ответ на этот вопрос сам:)
https://github.com/WebKit/webkit/commit/243a17dd57da84426316502c5346766429f2456d
Вышеупомянутый журнал коммитов очень полезен для меня!

У объекта Proxy есть член с именем getPrototypeOf.
Используя это getPrototypeOf, я могу изменить некоторые объекты на этапе поиска свойств в операторе for .. in.

let a = {x: 1, y: 2, z: 3};
a.__proto__ = {xx: 1, yy: 2, zz: 3};

for(let i in a) {
    print(i);
}

Выше приведен простой пример.
Оператор for .. in ищет свойства объекта a, а затем следует цепочку __proto__.
В этом контексте прокси getPrototypeOf является ловушкой для __proto__ поиска.
Пример следующий.

let a = {
  x: 1,
  y: 2,
  z: 3
};
let p = new Proxy(a, {
  getPrototypeOf: function() {
    console.log("getPrototypeOf - side effects can be caused here");
    return {
      a: 1,
      b: 2
    };
  }
});

for (let i in p) {
  console.log(i);
}
...