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 回答
0

扩展@Matt Ball 答案

您可以使用JSON.stringify字符串对象。

var a = {};
a.b = 1;

JSON.stringify(a);
// '{"b": 1}'

注意:您不能对圆形对象进行字符串化:

var a = {};
a.a = a;

JSON.stringify(a);
// TypeError: Converting circular structure to JSON
于 2013-06-22T18:09:34.860 回答