Объект.is (SameValueZero) potencial bug

Я столкнулся со следующими неожиданными результатами (последние 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

У меня проблемы с извлечением значений из карт из-за такого поведения. Любой способ исправить это без серьезных потерь производительности?

Спасибо

3 ответа

  1. Данный пример объектов в вопросе можно использовать JSON.stringify()для сравнения JSONформата представления объектов.

    Обратите внимание, что подход не следует использовать в качестве общего решения.

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

  2. Кажется, я нашел решение. Мне придется стрингировать ключи и использовать обычные объекты типа a:

    var map = new Map();
    
    var o = {foo: "bar"};
    map.set(o, "val");
    
    //---->
    
    var map = {};
    
    var k = JSON.stringify({foo: "bar"});
    map[k] = "val";
    
  3. var obj = { key: 'val' };
    

    в приведенном выше утверждении, потому что фактическое значение, которое будет хранитьсяobj, не является самим объектом и является ссылкой на объект, Object.isа Map.set/getфункции и даже ===оператор сравнивают ссылку на объект, а не значение.

    Так obj === { key: 'val' }и Object.is(o, { key: 'val' })являются абсолютно ложными;

    Подробнее о ссылках на объекты.