在javascript中,"for .. in"语句怎么会有副作用?
In javascript, how "for .. in" statement can have side effect?
我想知道for .. in
怎么会有副作用?
let arr = [1.1, 2.2];
let obj = {x: 1, y: 1, z: 1};
for(let prop in obj) {
...
}
考虑到上面的代码片段,是否可以在 for .. in
语句而不是循环体中更改 arr
中的某些元素?
我目前正在分析 JavaScriptCore JIT 编译器,DFG 假设 GetPropertyEnumerator
有副作用,据我所知它可以在 for .. in
语句中更改其他对象。
但是,我不知道这怎么可能。
所以我想这是否可能,如果可能的话,我该怎么做。
我自己找到了这个问题的答案:)
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
的属性,然后遵循 a 的 __proto__ 链。
在这种情况下,Proxy 的 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);
}
我想知道for .. in
怎么会有副作用?
let arr = [1.1, 2.2];
let obj = {x: 1, y: 1, z: 1};
for(let prop in obj) {
...
}
考虑到上面的代码片段,是否可以在 for .. in
语句而不是循环体中更改 arr
中的某些元素?
我目前正在分析 JavaScriptCore JIT 编译器,DFG 假设 GetPropertyEnumerator
有副作用,据我所知它可以在 for .. in
语句中更改其他对象。
但是,我不知道这怎么可能。
所以我想这是否可能,如果可能的话,我该怎么做。
我自己找到了这个问题的答案:)
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
的属性,然后遵循 a 的 __proto__ 链。
在这种情况下,Proxy 的 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);
}