JavaScript는 array.length를 캐시하지 않습니다.

4013 단어 showdevjavascript

오해: array.length는 JavaScript 엔진에 의해 캐시됩니다.



JavaScript VM이 최적화를 위해 array.length를 캐시한다는 많은 댓글과 게시물을 보았습니다.

따라서 다음 코드는 필요하지 않습니다 ...

for(var i=0,n = a.length;i<n;i++) {
    ...
}


그리고 이것은 최신 컴파일러에 의해 자동으로 최적화됩니다.

for(var i=0;i<a.length;i++) {
    ...
}


이것은 신화입니다. 컴파일러는 최적화할 수 있지만 for 루프가 다른 메서드를 호출하지 않고 간단한 수학적 단계를 수행하는 경우에만 최적화할 수 있습니다.



위의 예에서,

function run(a, f) {

   for(var i = 0; i < a.length; i++) {
       f(a[i]);
   }

}

var a = [0,1,2,3];

run(a, function(n) {
   console.log(n);
   if (n == 2) {
      a.push(4);
      a.push(5);
   }
});


엔진이 캐시하는 경우 출력은 0,1,2,3 array.length 이어야 하지만, 눈치채셨다면 출력은 0,1,2,3,4,5 입니다.

즉, 모든 비교 전에 a.length를 읽습니다.

최적화는 비용이 많이 듭니다



스크립트의 소스 수준 분석은 비용이 많이 드는 프로세스입니다. JavaScript 엔진이 캐시 여부를 결정하기 위해 복잡한 논리를 감지하는 데 시간을 할애하면 시작 시간이 느려집니다.

좋은 웹페이지 즐겨찾기