JavaScript는 ++ 연산자를 어떻게 처리합니까?
-
23-08-2019 - |
문제
JavaScript는 객체와 펑키 자동 변환을 수행합니다.
var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));
인쇄 :
4040
40140
120
+, 인수 중 하나라도 객체/문자열이라면 모든 인수를 문자열로 변환하려고 시도한 다음 그것들을 연결하기 때문입니다. 모든 인수가 숫자라면 함께 추가합니다. * 및 unery + + 객체를 Tostring을 사용하여 숫자로 변환합니다 (여기에 표시되지 않음).
JavaScript는 ++ 연산자에게 무엇을합니까?
해결책
11.3 포스트 픽스 표현식
통사론
postfixexpression :
- lefthandsideexpression
- lefthandsideexpression [여기에는 lineterminator 없음] ++
- lefthandsideexpression [여기에 lineterminator 없음] -
11.3.1 Postfix 증분 연산자
생산 postfixexpression : lefthandsideexpression [여기에 lineterminator 없음] ++ 다음과 같이 평가됩니다.
- lefthandsideexpression을 평가하십시오.
- getValue (result (1))을 호출하십시오.
- 통화 tonumber (결과 (2)).
- + 연산자 (섹션 11.6.3)와 동일한 규칙을 사용하여 값 1을 결과 (3)에 추가하십시오 (3).
- putValue (result (1), result (4))을 호출하십시오.
- 반환 결과 (3).
이것은 PostInc의 작동 방식에 대한 의사 JavaScript 코드입니다.
function postInc(a) {
var x = +a; // Converts a to a number, Section 11.4.6 Unary + Operator
a = x + 1;
return x;
}
편집 : AS 미세 사무엘 말했다 : 그것은 parseint가 아닙니다. 그것을 반영하도록 업데이트되었습니다.
다른 팁
다음 코드는 이것을 잘 보여줍니다.
var a = {toString: function() {return "40"; }};
nl(typeof a);
nl(typeof +a);
nl(typeof a);
nl(typeof (a++));
nl(a);
nl(typeof a);
출력은 다음과 같습니다.
object
number
object
number
41
number
Unary Plus는 객체를 숫자로 변환하고 수정하지 않습니다. A ++는 먼저 객체를 숫자로 변환하고 그런 다음 해당 번호를 반환합니다, 그런 다음 숫자를 증가시키고 값을 a에 저장합니다.
이것은 A ++가 먼저 물체를 반환 한 다음 숫자와 증분으로 변환하는 다른 가능한 솔루션에 반대합니다.
그만큼 ++
연산자는 "Tonumber"변환 (기본적으로 유형 규칙과 함수의 가치 조합)을 수행합니다. 기본적으로 모든 해결 표현
resolveExpression++
JS 엔진이 수행 한 단계는 다음과 같습니다
<temp> = toNumber(resolveExpression);
resolveExpression = <temp> + 1;
<result> = <temp>
비 원자의 해결 표현의 경우, 예를 들어. base.resolve++
또는 base["resolve"]++
, 등. base
한 번만 해결 한 다음 재사용됩니다. 모든 제정신의 경우 이것은 관련이 없지만, 증가하는 값이 기본 객체를 변경하는 값의 값을 가진 객체 인 경우 중요합니다.
예를 들어.
base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;