Object.is(SameValueZero)潜在的bug

时间:2016-11-05 05:29:53

标签: javascript v8

我遇到了以下意外结果(最新的Chrome,FF):

var o = {foo: "bar"};
alert(Object.is(o, {foo: "bar"})); //false

var map = new Map();
map.set(o, 1);

var o2 = {foo: "bar"};
alert(map.get(o2)); //undefined

由于此类行为,我在从Google地图检索值时遇到问题。没有严重的性能损失可以解决这个问题吗?

由于

3 个答案:

答案 0 :(得分:0)

给出Question的示例对象,您可以使用JSON.stringify()来比较对象的JSON格式表示。

请注意,该方法不应用作一般解决方案。

var o = {foo: "bar"};

console.log(JSON.stringify(o) === JSON.stringify({foo: "bar"})); 

答案 1 :(得分:0)

好吧,好像我找到了解决方案。我将需要对键进行字符串化并使用常规对象:

var map = new Map();

var o = {foo: "bar"};
map.set(o, "val");

//---->

var map = {};

var k = JSON.stringify({foo: "bar"});
map[k] = "val";

答案 2 :(得分:0)

var obj = { key: 'val' };
在上述语句中

,因为obj将存储的实际值不是对象本身,而是对象引用,Object.isMap.set/get函数甚至===运算符比较对象引用而不是值。

所以obj === { key: 'val' }Object.is(o, { key: 'val' })绝对是错误的;

Read more about object references