2016-12-12 10 views
6

私はいくつかのJavaScriptコードを継承しましたが、私は実際にはJavaScriptの専門家ではありません。hasOwnProperty()が配列用Chromeで動作しない

私たちは、bucketsと呼ばれるハッシュと値の集合のように機能するオブジェクトを持っています。それはハッシュ値であるプロパティを持ち、各プロパティはオブジェクトです。ここでは、ブラウザのデバッガで次のようになります。

enter image description here

私たちはバケツオブジェクト内のハッシュが存在するかどうかを確認するためにhasOwnProperty()を使用していますcontainsKey()機能を持っています。

containsKey: function(key) { 
    var hash = this.comparer.getObjectHashCode(key); 
    if (!this.buckets.hasOwnProperty(hash)) 
     return false; 

    var array = this.buckets[hash]; 
    for (var i = 0; i < array.length; i++) { 
     if (this.comparer.areEqual(array[i].key, key)) 
      return true; 
    } 
    return false; 
} 

このコードは、少なくとも3年間完璧に動作しています。ここ数週間でChromeでの作業が停止しました。 IEではまだ正常に動作します(FFについてはわかりません)。

私はそれが仕事を続けなければならないようです。私はbucketsに検索されているハッシュプロパティが含まれていることを確認しました。しかし、hasOwnProperty()はfalseを返すようになりました。

もっと適切な機能がありますか?それは、デバッガに失敗していますのはここ

です:

enter image description here

+0

どのように動作しませんか?コンソールにエラーが報告されていますか? '.hasOwnProperty()'がどのように動作するかという問題がどのように分かっていますか? – Pointy

+0

コードをここに追加するか、jsfiddle ... –

+0

質問に書いたように:「バケットには検索されているハッシュプロパティが含まれていることを検証しましたが、hasOwnProperty()は現在falseを返しています。これは問題が 'hasOwnProperty()'にあることを私が知る方法です。 どのようなコードを追加する必要がありますか?これは関連する機能です。コードベース全体は53Kラインです。 – Pete

答えて

6

我々は12月にChromeバージョン54.0.2840.99から55.0.2883.75にアップグレードしたときに導入されたChromeのバグのいくつかの並べ替えがあるように見えます2、2016.

私たちの特定の問題の解決策は、正の数だけを返すように私たちのハッシュ関数を変更することでした。負の数を使った小さなテストは、(コメントのsquintの例のように)うまくいくように見えますが、私たちのアプリケーションでは、Chromeでは動作しません。

私はそれに掘り起こす時間がありません。私はそれがアイテムの数と関係があるかどうかわかりません(私たちは "バケツ"に約170程度のアイテムしか持っていません)。

アップデート:が、クロム55で、コンソールに行くべき

obj = { 
    buckets: {}, 
    comparer: { 
    getObjectHashCode: function(str) { // hardcoded magic hashing 
     return { 
     "SUPPLYINVENTORY/SUPTRANSENTRY": -1525029354, 
     "PROPANE/LOADPROPANETOGROWERAR": 115289505 
     }[str.toUpperCase()]; 
    }, 
    areEqual: function(a, b) { 
     return a.toUpperCase() == b.toUpperCase(); 
    } 
    }, 
    containsKey: function(key) { 
    var hash = this.comparer.getObjectHashCode(key); 
    if (!this.buckets.hasOwnProperty(hash)) 
     return false; 

    var array = this.buckets[hash]; 
    for (var i = 0; i < array.length; i++) { 
     if (this.comparer.areEqual(array[i].key, key)) 
     return true; 
    } 
    return false; 
    } 
}; 
obj.buckets[-1525029354] = [{ 
    key: "SUPPLYINVENTORY/SUPTRANSENTRY", 
    value: "$SupTransEntry object" 
}]; 
obj.buckets[115289505] = [{ 
    key: "PROPANE/LOADPROPANETOGROWERAR", 
    value: "$LoadPropaneToGrowerAR object" 
}]; 
console.log(obj.containsKey("SUPPLYINVENTORY/SUPTRANSENTRY"), obj.containsKey("PROPANE/LOADPROPANETOGROWERAR")); 

テキスト「真真」:

gre_gorは、コメントに上記のバグを示すサンプルを作成しましたそれは "偽真"を生成する。

問題を確実に再現するためのテストのためのgre_gorありがとうございます。 Googleにバグを報告しました。

更新#2:バグが私の提出の3日前に提出されました。問題は修正されており、すぐに取り組まなければならないことはありません。 - Chromium Bug #673008

+3

私は、今のところmscorlib.jsにhasOwnProperty(hash.toString())をhasOwnProperty(hash)をhasOwnPropertyに変更することでこの問題を解決しました。それはいくつかの場所で見られます。 –

関連する問題