1

オブジェクトをキーとして使用してハッシュをロードしようとすると、予期しない動作が発生します。つまり、後でデータを取得するとき、ハッシュは常に最後に使用されたキーを参照します。これはクロージャーの動作によるものだと思いますが、これを防ぐために必要なことを行ったと思いました。

var hash = {};
var arry = [];
var list = [{val:"a"},{val:"b"},{val:"c"}];

var len  = list.length;

dump("load : \n");

for (var i=0;i<len;i++) {

  let pos = i;
  let obj = list[pos];
  hash[obj] = obj.val;
  arry.push(obj);
  dump("    "+obj.val+"    "+hash[obj]+"\n");
}

dump("retrieve : \n");

for (var i=0;i<len;i++) {

  let pos = i;
  let obj = list[pos];
  dump("    "+obj.val+"    "+arry[pos].val+"    "+hash[obj]+"\n");
}

出力は次のとおりです。

load :
    a    a
    b    b
    c    c
retrieve :
    a    a    c
    b    b    c
    c    c    c

let を使用して反復オブジェクトのスコープを上げることでこれを防止しようとして、意図的に船外に出ましたが、まだ何かが欠けているようです。この背後にある理由と、Javascript を使用してそれを防ぐ方法を理解したいと思います。

4

2 に答える 2

6

JavaScript のオブジェクト キーは文字列のみです。これは、文字列ではないものを渡すと、文字列に変換されることを意味します。「オーバーライド」しないオブジェクトを使用しているためObject.toString、それらはすべて同じ文字列表現 ( "[object Object]") を持ちます。これが、ハッシュが常に最後に使用されたキーを参照する理由です。

詳細はこちら: Javascript オブジェクト プロパティの奇妙な等価性の問題

于 2013-06-22T18:05:34.620 に答える