성능도 이유입니다. 때로는 키를 반복해야 할 수도 있습니다. 이를 수행하는 몇 가지 방법이 있습니다
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
나는 보통 for of Object.keys()
옳은 일을하고 상대적으로 간결하므로 검사를 추가 할 필요가 없으므로 사용합니다.
그러나 훨씬 느립니다 .
이유 Object.keys
가 느리다고 추측하는 것은 분명 Object.keys()
하며 할당을해야합니다. 실제로 AFAIK는 이후 모든 키의 사본을 할당해야합니다.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
JS 엔진이 어떤 종류의 불변 키 구조를 사용할 수 있기 때문에 불변 키 Object.keys(object)
를 반복 object.newProp
하고 완전히 새로운 불변 키 객체 를 생성하는 참조 를 반환 하지만 최대 15 배까지 명확하게 느립니다.
점검조차도 hasOwnProperty
최대 2 배 느려집니다.
이것의 핵심은 성능에 민감한 코드가 있고 키를 반복 해야하는 경우 for in
호출하지 않고도 사용할 수 있다는 것입니다.hasOwnProperty
입니다. 수정하지 않은 경우에만이 작업을 수행 할 수 있습니다Object.prototype
Object.defineProperty
추가 한 항목을 열거 할 수없는 경우 프로토 타입을 수정하는 데 사용하는 경우 위의 경우 JavaScript의 동작에 영향을 미치지 않습니다. 불행히도 Chrome 83 이상에서는 성능에 영향을 미칩니다.
perf 문제를 강제로 나타 내기 위해 열거 할 수없는 3000 개의 속성을 추가했습니다. 30 개의 속성만으로도 테스트가 너무 가까워서 성능에 영향이 있는지 확인할 수 없었습니다.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77과 Safari 13.1은 Augmented 클래스와 Unaugmented 클래스 사이에 성능 차이가 없었으며 v8 이이 영역에서 수정되어 성능 문제를 무시할 수 있습니다.
그러나 의 이야기가Array.prototype.smoosh
있습니다. 짧은 버전은 인기있는 라이브러리 인 Mootools Array.prototype.flatten
입니다. 표준위원회가 네이티브를 추가하려고 할 때 Array.prototype.flatten
많은 사이트를 중단하지 않고 는 네이티브를 추가 할 수 없었습니다. 브레이크에 대해 알게 된 개발자는 es5 방법의 이름을 smoosh
농담으로 제안 했지만 사람들은 그것이 농담이라는 것을 이해하지 못해서 놀랐 습니다. 그들은 정착했다flat
대신에flatten
이야기의 교훈은 기본 객체를 확장해서는 안된다는 것입니다. 당신이 당신의 물건 파괴와 같은 문제를 겪을 수 있고 특정 라이브러리가 MooTools만큼 인기가 없다면 브라우저 공급 업체는 당신이 일으킨 문제를 해결하지 못할 것입니다. 도서관이 그 인기를 얻는다면 다른 사람들이 당신이 일으킨 문제를 해결하도록 강요하는 것입니다. 따라서 기본 객체를 확장하지 마십시오