Так, не пишите тесты глубокой ночью ) Одна загадка с утра раскрылась, но стало ещё веселей. Действительно, для structuredClone и Object.assign я в цикле не выходил из мономорфности, потому что стрелял клонами, они имеют между собой одинаковую мапу





const objToCopy1 = { a: 1, b: 2 };

const objToCopy2 = { a: 1, b: 2 };

const N = 100;



for (let i = 0; i < N; i++) {

testFunction1(JSON.parse(JSON.stringify(objToCopy1)));

testFunction1(JSON.parse(JSON.stringify(objToCopy2)));



testFunction2({...objToCopy1})

testFunction2({...objToCopy2})



testFunction3(structuredClone(objToCopy1))

testFunction3(structuredClone(objToCopy2))

}





Но вот что интересно, при увеличении N testFunction2 падает в деоптимизацию, %HaveSameMap({...objToCopy1}, {...objToCopy2}) вываливается в false.



Можете сами попробовать





const objToCopy1 = { a: 1, b: 2 };

const objToCopy2 = { a: 1, b: 2 };

const N = 13;



for (let i = 0; i < N; i++) {

console.log(%HaveSameMap({...objToCopy1}, {...objToCopy2}))

}





В данном случае у меня на 13-й итерации (зависит от версии v8) мапы уже не равны.



gist чтобы погонять spread https://gist.github.com/melikhov-dev/51f92e84b7aa9456a4cdba0550130df7