首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript中,"for . in“语句如何产生副作用?

问在javascript中,"for . in“语句如何产生副作用?
EN

Stack Overflow用户
提问于 2019-03-07 09:42:38
回答 1查看 146关注 0票数 4

我想知道for .. in是如何产生副作用的?

代码语言:javascript
复制
let arr = [1.1, 2.2];
let obj = {x: 1, y: 1, z: 1};
for(let prop in obj) {
    ...
}

考虑到上面的代码片段,是否可以在arr的for .. in语句中更改某些元素,而不是在循环体中?

我目前正在分析JavaScriptCore JIT编译器,DFG假设GetPropertyEnumerator有副作用,据我所知,它可以在for .. in语句中更改其他对象。

但是我不知道这怎么可能。

所以我希望这是可能的,如果可能的话,我怎么能做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-07 11:19:23

我自己找到了这个问题的答案:)

https://github.com/WebKit/webkit/commit/243a17dd57da84426316502c5346766429f2456d

以上提交日志对我很有帮助!

Proxy对象的成员名为getPrototypeOf。

通过使用这个getPrototypeOf,我可以在for .. in语句的属性查找阶段修改一些对象。

代码语言:javascript
复制
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__查找的陷阱。

例子就是跟着一个。

​

代码语言:javascript
复制
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);
}

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55040552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档