이 예제에서“엄격한 사용”이 성능 10 배를 향상시키는 이유는 무엇입니까?


128

질문 Stringing.prototype 성능 확장 질문에 따라 메서드에 추가 "use strict"하는 것만으로 String.prototype성능이 10 배 향상 되었기 때문에 정말 흥미 롭습니다 . 설명 에 의해 BERGI은 짧고 나에게 그것을 설명하지 않습니다. 왜 거의 동일한 두 가지 방법 사이에 극적인 차이가 "use strict"있는가? 이것에 대한 이론과 더 자세하게 설명 할 수 있습니까?

String.prototype.count = function(char) {
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};

String.prototype.count_strict = function(char) {
  "use strict";
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};
// Here is how I measued speed, using Node.js 6.1.0

var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;

console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');

console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');

결과:

proto: 101 ms
proto-strict: 7.5 ms

1
테스트를 수행 this[i] === char하여 동일한 차이가 있는지 확인할 수 있습니까?
어둠의 절대자 니트

1
this[i] === charDOM 환경에서 테스트 한 결과는 동일합니다.
Cristian Traìna

2
bergi의 설명에 따르면 count함수 를 호출 할 때 this매개 변수는 문자열 리터럴 대신 문자열 객체로 캐스팅되어야하지만 엄격 모드에서는 올바르게 작동하기 위해 필요하지 않습니다. 이것이 사실이 아닌 이유, 나는 대답에 매우 관심이 있습니다.
Nick Larsen

3
@NickLarsen : 언어가 어떻게 지정되었는지입니다. 전통적으로 JS는 항상 객체를 this으로 유지했지만 엄격 모드에서는 해당 단계를 건너 뛰므로 기본 문자열 또는 제공된 모든 것을 얻습니다 this.

6
"use strict";소년들을 어디에나 둘 시간입니다 ! Goooold
Jonathan

답변:


155

엄격 모드에서는 this컨텍스트가 객체가 될 수 없습니다. 객체가 아닌 객체에서 함수를 호출하면 객체 this가 아닌 객체가됩니다.

반대로, 엄격하지 않은 모드에서는 this컨텍스트가 아직 오브젝트가 아닌 경우 항상 오브젝트에 랩핑됩니다. 예를 들어, (42).toString()제 랩 42A의 Number다음 개체 및 호출 Number.prototype.toStringNumber같은 오브젝트 this컨텍스트. 엄격 모드에서는 this컨텍스트가 그대로 유지되고 컨텍스트 로 호출 Number.prototype.toString됩니다 .42this

(function() {
  console.log(typeof this);
}).call(42); // 'object'

(function() {
  'use strict';
  console.log(typeof this);
}).call(42); // 'number'

귀하의 경우, 비 엄격 모드 버전은 시간 포장 및 원시 풀기를 많이 소비 string에들 String객체 래퍼와 다시. 반면 엄격 모드 버전은 프리미티브 string에서 직접 작동하므로 성능이 향상됩니다.


1
또한 제거 with하면 모든 변수 조회 iirc에 약간 도움이됩니다.
zzzzBov

2
@zzzzBov가 잘못되었습니다. 브라우저에서 어떤 변수 표현식이 어떤 변수를 참조하는지 추론 할 수 있으므로 제거가 엄청나게with 도움 이 됩니다 .
John Dvorak

2
비 객체 this가 always-object보다 "더 엄격하다"는 것은 직관적이지 않은 것 같습니다 this.
IllidanS4는 Monica가

2
@ IllidanS4 :이 경우에 대해 대부분입니다 this입니다 null또는 undefined실수 모드에서 전역 객체가 될 것이다.
Bergi

6
@ IllidanS4 : 원한다면 "실제 this"와 "래퍼 this" 로 생각하십시오 . 오브젝트 랩퍼는 존재하지 않았어야하는 kludge이므로 엄격 모드는 가능할 때 더 많은 것을 피하는 것이 좋습니다.
Ry-
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.