我找不到有关此问题的任何信息;为什么下面的代码在IE中不起作用?
window.x = 45;
delete window.x;
// or delete window['x'];
IE报告“对象不支持此操作”错误。与在IE问题中遍历窗口属性有什么关系吗?
我找不到有关此问题的任何信息;为什么下面的代码在IE中不起作用?
window.x = 45;
delete window.x;
// or delete window['x'];
IE报告“对象不支持此操作”错误。与在IE问题中遍历窗口属性有什么关系吗?
Answers:
我会这样:
window[x] = undefined;
try{
delete window[x];
}catch(e){}
Gasper对他完成的解决方案发表了评论,但我认为值得一提的是实际答案:
try
{
delete window.x;
}
catch(e)
{
window["x"] = undefined;
}
有趣的是,我今晚正好撞上它。IE上抛出了异常,但Firefox上没有。我怀疑这种解决方法会泄漏内存,因此请谨慎使用。
有人问,为什么不分配未定义?如果您以后要枚举键,这很重要(尽管如果您依靠变通办法,键枚举仍然无法满足您的要求...)。但是无论如何,要突出显示删除和简单地分配未定义(http://jsfiddle.net/fschwiet/T4akL/)之间的区别:
var deleted = {
a: 1
};
var cleared = {
a: 1
};
delete deleted["a"];
cleared["a"] = undefined;
for(var key in deleted) {
console.log("deleted has key", key);
}
for(var key in cleared) {
console.log("cleared has key", key);
}
console.log("deleted has a?", deleted.hasOwnProperty('a'));
console.log("cleared has a?", cleared.hasOwnProperty('a'));
产生输出:
cleared has key a
deleted has a? false
cleared has a? true
在处理我自己的数据时,我实现了此解决方案-数据的频率与缓存的频率无关,因此内存泄漏可能已成为问题。这很昂贵,但是定期重新映射对象是我确定它不会失控的最简单方法。
obj = {a: 1, b: 2, c: 3};
var max;
function unset(obj, key) {
try {
delete obj[key];
} catch (e) {
obj[key] = undefined;
}
max++;
if(max > 200) {
var keys = Object.keys(obj);
var len = keys.length;
var n_obj = {};
for(var i = 0; i < len; i++) {
if(obj.hasOwnProperty(keys[i]) && obj[keys[i]] !== undefined) {
n_obj[keys[i]] = obj[keys[i]];
}
}
return n_obj;
}
return obj;
}
obj; //{a: 1, b: 2, c: 3}
obj = unset(obj, "b"); //{a: 1, b: undefined, c: 3} OR {a: 1, c: 3}
//and then eventually we'll garbage collect and...
obj = unset(obj, "b"); //{a: 1, c: 3}
希望这对某些人有用!
Object.keys()
不能在<= IE8中使用(首先是引起麻烦的那些delete
)。另外,您可能是指obj[key] = undefined
在catch块内部。;]
delete
,即使该属性不存在或不可删除(window.x
无论如何也不应该),而新的第5版规范仅允许引发异常来自delete
新的严格模式。window
在这方面没有什么特别的。但是,IE8中的JScript引擎在2010