この問題に関する情報は見つかりません。 IEで次のコードが機能しないのはなぜですか?
window.x = 45;
delete window.x;
// or delete window['x'];
IEは「オブジェクトはこのアクションをサポートしていません」というエラーを報告します。 IE問題のウィンドウプロパティを反復することと関係がありますか?
私はこのようにします:
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
これは役に立ちますか?
window.x = 45;
alert(window.x);
window.x = null;
私はこれをIE=で試してみましたが、window.xには値を設定できたことを証明する値がありました。値をnullに設定することは、値をクリアするための最善の策です。
私は自分のデータのキャッシュを処理するときにこのソリューションを実装しました-データはキャッシュの頻度ではなく、メモリリークが問題になる可能性がありました。コストはかかりますが、定期的にオブジェクトを再マップすることが、手に負えなくなっていないことを確認する最も簡単な方法でした。
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}
うまくいけば、それは一部にとって有用です!