質問

IE(IE8)のハンドリングでバグを見つけたと思います。これを小さな例に数時間沸騰させた後、IEは、プロトタイプにあるか、オブジェクトの「独自のプロパティ」であるかに関係なく、for -inループで「tostring」と呼ばれるプロパティをスキップするように見えます。

私は私を置きました ここでテストコード:

function countProps(obj) {
    var c = 0;
    for (var prop in obj) {
        c++;
    }
    return c;
}

var obj = {
    toString: function() {
        return "hello";
    }
};

function test() {
    var o = "";
    var d = document.getElementById('output');

    o += "<br/>obj.hasOwnProperty('toString') == " + obj.hasOwnProperty('toString');
    o += "<br/>countProps(obj) = " + countProps(obj);
    o += "<br/>obj.toString() = " + obj.toString();

    d.innerHTML = o;
}

これは次のとおりです。

obj.hasOwnProperty('toString') == true
countProps(obj) = 1
obj.toString() = hello

しかし、つまり、私は取得しています:

obj.hasOwnProperty('toString') == true
countProps(obj) = 0
obj.toString() = hello

「tostring」と呼ばれるプロパティのこの特別なケーシングは、メソッドをfunction.prototypeにコピーしようとするコードで大混乱を招きます。

誰もが回避策を知っていますか?これはある種の癖モードのみの動作ですか、それとも単なるバグですか?

役に立ちましたか?

解決

はい、それはバグです。見る この答え.

引用 CMS:

別のよく知られているjscriptバグは「dontenumバグ」です。スコープチェーンのオブジェクトに列挙不可能なプロパティ({dontenum}属性がある)が含まれている場合、プロパティが他のオブジェクトに影が付けられている場合、それは非存在します。たとえば、列挙可能:

var dontEnumBug = {toString:'foo'}.propertyIsEnumerable('toString');

IEでfalseと評価されます。これは、プロパティが訪問されないため、forinステートメントを使用するときに問題を引き起こします。

他のヒント

これはIEのバグであり、名前付きのプロパティにも適用されます valueOf.

あなたはこのようにそれを回避することができます:

if(obj.toString !== Object.prototype.toString || obj.hasOwnProperty("toString"))
    //Handle it
if(obj.valueOf !== Object.prototype.valueOf || obj.hasOwnProperty("valueOf"))
    //Handle it
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top