<p>저는 다음과 같은 해결책을 생각해냈습니다</p>
<pre class="brush:php;toolbar:false;">functionkeyToLowerCase(obj) {
var 키 = Object.keys(obj);
var n = 키.길이;
동안 (n--) {
var key =keys[n]; // 배열 조회 횟수를 줄이기 위해 "캐시"합니다.
if (key !== key.toLowerCase()) { // 이미 소문자일 수 있습니다.
obj[key.toLowerCase()] = obj[key] // 값을 새로운 소문자 키로 바꿉니다.
delete obj[key] // 이전 키 삭제
}
}
반환(obj);
}</pre>
<p>그러나 v8이 이를 어떻게 처리할지는 잘 모르겠습니다. 예를 들어 실제로 다른 키를 삭제하게 될까요, 아니면 참조만 삭제하면 가비지 컬렉터가 뒤처지게 될까요? </p>
<p>또한 저는 이러한 테스트를 만들었으며 귀하의 답변을 거기에 추가하여 두 테스트가 어떻게 일치하는지 확인할 수 있기를 바랍니다. </p>
이로 인해 혼란이 더 커지나요? 가비지 수집가가 이에 만족할까요? </p>
사용
Object.fromEntries
(ES10)새로운
으아악Object.fromEntries
메소드를 사용하는 로컬 및 불변 솔루션:이 기능이 널리 사용 가능할 때까지 다음 polyfill사용자 정의를 사용할 수 있습니다.
으아악한 가지 이점은 이 방법이
Object.entries
의 반대이므로 이제 객체 표현과 배열 표현 간에 전환할 수 있다는 것입니다.제가 생각할 수 있는 가장 빠른 방법은 새 개체를 만드는 것입니다.
으아악저는 v8의 현재 내부 작동 방식에 대해 명확하게 답변할 만큼 익숙하지 않습니다. 몇 년 전에 개발자가 개체에 대해 논의한 비디오를 보았는데, 기억이 맞다면 참조만 삭제하고 가비지 수집기가 이를 처리하도록 합니다. 하지만 그것은 몇 년 전의 일이므로 당시에는 사실이었다고 해도 지금은 반드시 그런 것은 아닙니다.
나중에 문제가 될까요? 무엇을 하고 있는지에 따라 다르지만 아마도 그렇지 않을 것입니다. 임시 개체를 만드는 것은 매우 일반적이므로 코드는 이를 처리하도록 최적화되어 있습니다. 그러나 모든 환경에는 한계가 있으며 이로 인해 문제가 발생할 수도 있습니다. 실제 데이터로 테스트해야 합니다.