我正在通过窗口全局范围内提供的整个javascript对象树进行递归。
它在Chrome,Firefox和Safari中都很精致,但我在Internet Explorer中遇到了一些问题。
基本上,当我遍历树时,我正在构建一堆对象,所以我可以检查一个对象的行已在多个位置进行了对齐。例如,我检查。
var ignoreStack = [window, document]; // grows over time to contain every object
ignoreStack.contains = function(obj) {
for(var i=0;i<this.length;i++) {
if (this[i] === obj) {return true;}
}
return false;
};
// ... further down the line inside a recursion
if (!(obj instanceof Object)) {return;}
for (var prop in obj) {
if (ignoreStack.contains(obj[prop])) {return;}
ignoreStack.push(obj[prop]);
recurse(obj[prop], prop);
}
现在唯一的问题是它检查以下内容:
// Returns true in Chrome, Safari and Firefox
console.log(window.frames.frames === window.frames);
// Return false in IE
树中的每个其他对象都等于它自己,但是IE中的window.frames
似乎是唯一不对它自身真实的例外,所以递归继续如下:
// window.frames.frames.frames.frames.frames ...etc
有没有人知道为什么window.frames
不等于自己?
我尝试使用IE Developer工具进行谷歌搜索和调试,我只能收集到的是DispHTMLWindow2
类型的对象(这对我来说意义不大)和那个(与其他不同)浏览器)既不是对象也不是数组。
// Returns true in Chrome, Safari and Firefox
console.log(window.frames instanceof Object);
// Return false in IE
如果有人能够了解IE中window.frames
的行为与其他任何javascript对象(导致此类无限递归)不同的原因,那将非常感激。
提前致谢。
答案 0 :(得分:4)
Related question about other host objects that are not equal in IE
如果有人能够了解IE中的window.frames与其他任何javascript对象(导致这种类型的无限递归)不同的原因,那将非常感激。
window.frames
是一个宿主对象。允许主机对象在ES3中做任何他们喜欢的事情。 IE因出现严重行为不当的主机对象而臭名昭着。你无能为力。
我建议你做脏兮兮的黑客,这是一个硬编码检查密钥是'frames'
而obj是window
而忽略了整个事情。
window.frames
内还有另一堆属性也不行。