9

for-in javascriptステートメントの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

しかし、IEでは、次のようになります。

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

'toString'と呼ばれるプロパティのこの特別なケーシングは、メソッドをFunction.prototypeにコピーしようとする私のコードで大混乱を引き起こしています-私のカスタムtoString関数は常にスキップされます。

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

4

2 に答える 2

10

はい、それはバグです。この回答を参照してください。

CMSの引用:

もう1つのよく知られているJScriptのバグは、「DontEnumバグ」です。スコープチェーン内のオブジェクトに列挙できないプロパティ({DontEnum}属性がある)が含まれている場合、プロパティが他のオブジェクトにシャドウされていると、非列挙可能、例:

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

IEではfalseと評価されます。これにより、プロパティにアクセスされないため、for-inステートメントを使用するときに問題が発生します。

于 2010-09-14T00:42:41.457 に答える
2

これはIEのバグであり、という名前のプロパティにも当てはまりますvalueOf

次のように回避できます。

if(obj.toString !== Object.prototype.toString || obj.hasOwnProperty("toString"))
    //Handle it
if(obj.valueOf !== Object.prototype.valueOf || obj.hasOwnProperty("valueOf"))
    //Handle it
于 2010-09-14T00:57:47.173 に答える