문제

JavaScript는 객체와 펑키 자동 변환을 수행합니다.

var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));

인쇄 :

4040
40140
120

+, 인수 중 하나라도 객체/문자열이라면 모든 인수를 문자열로 변환하려고 시도한 다음 그것들을 연결하기 때문입니다. 모든 인수가 숫자라면 함께 추가합니다. * 및 unery + + 객체를 Tostring을 사용하여 숫자로 변환합니다 (여기에 표시되지 않음).

JavaScript는 ++ 연산자에게 무엇을합니까?

도움이 되었습니까?

해결책

에서 ecmascript 언어 사양

11.3 포스트 픽스 표현식

통사론

postfixexpression :

  • lefthandsideexpression
  • lefthandsideexpression [여기에는 lineterminator 없음] ++
  • lefthandsideexpression [여기에 lineterminator 없음] -

11.3.1 Postfix 증분 연산자

생산 postfixexpression : lefthandsideexpression [여기에 lineterminator 없음] ++ 다음과 같이 평가됩니다.

  1. lefthandsideexpression을 평가하십시오.
  2. getValue (result (1))을 호출하십시오.
  3. 통화 tonumber (결과 (2)).
  4. + 연산자 (섹션 11.6.3)와 동일한 규칙을 사용하여 값 1을 결과 (3)에 추가하십시오 (3).
  5. putValue (result (1), result (4))을 호출하십시오.
  6. 반환 결과 (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++;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top