2016-10-20 2 views
28

내가 본 적이없는 흥미로운 점은 다른 질문에 게시되었습니다. 그들은 여분의 +가 문자열로 변환 생각JavaScript는`+ + i`를 어떻게 해석합니까?

var i = + +1; 

,하지만 그들은 단순히 변환 원인 인 문자열에 추가했다 : 그들은 뭔가를했다.

그러나 이것은 다음과 같은 질문으로 나를 안내합니다.

나는 실제로 컴파일러 오류가 될 것이라고 예상했지만 자바 스크립트 (적어도 Chrome에서는)는 정상적으로 처리되었습니다 ... 기본적으로 아무 것도 수행하지 않습니다. Demo

var i = 5; 
 
var j = + +i; 
 
document.body.innerHTML = i === j ? 'Same' : 'Different';

사람이 실제로 발생 있는지와 자바 스크립트를이 과정에 무엇을하고 있는지 알고

내가 보여 조금 JSFiddle을 만들어?

++은 (예, ++5가 나는 그것이 ++i처럼 취급 것이지만, i 증가하지 않으며, 당신은 당신이 할 수없는 값 (예를 들어, + +5)와 함께 할도 수 어쩌면 생각

참조 오류).

간격도 영향을 미치지 않습니다 (예 : + + 1+ +1은 동일 함).

나의 가장 좋은 추측은 근본적으로 긍정적/부정적 징후로 취급하고 함께 모으는 것입니다. 1 == - -1-1 == + -1처럼 보일 수 있지만 이상하게 보입니다.

이 동작이 이상한 것입니까, 아니면 표준 어딘가에 문서화되어 있습니까?

+1

그것은 나에게 보인다. 왼쪽 피연산자가 없으면 오른쪽 피연산자를 반환합니다. – Amy

+5

'+'또는'-' 연산자는 사이에 공백을 넣으면 단순한 '+/-'연산자입니다. 당신은'+ + + 3'을 할 수 있고 그것은'3'을 줄 것입니다. 이상한 점은 없습니다 – galchen

+0

http://pythontutor.com/javascript.html#mode=edit –

답변

32

AST Explorer을 통해 진술을하면, 단항 + 연산자가있는 단 하나의 표현이 두 개 중첩 된 것을 확인할 수 있습니다.

그것은 ++i 구성된 단항 표현, 그리고 +i+i 구성된 단항 표현 자체입니다.

단항 + 연산자를 사용하는 단항 식은 표현식 부분을 숫자로 변환합니다. 그래서 당신은 본질적으로 i을 숫자로 변환하고, 그 결과를 다시 숫자로 변환합니다 (다시 말하면 no-op입니다). 추가로 완료를 위해서

, 그것은 많은 수준에 작동 : 나를 위해

var i = 5; 
console.log(+ + + + + +i); // 5 
console.log(i); // still 5 
+0

분명히 이들을 무한대로 연결할 수 있습니다. '+ + + + + + + + + 1'은 유효한 JavaScript입니다. – tadman

+0

실은 할 수 있겠지. 편집을 중간에 잡았습니다. –

+8

JavaScript의 buffalo buffalo buffalo입니다. – Amy

1

+ 연산자는 숫자로 변환되며, 둘 사이에 공백이있는 + 연산자는 아무 것도 수행하지 않습니다.

5

은 매우 분명하다; 당신이 ++variable을 할 경우

var a = +3; 
var b = +a; // same as a, could be -a, for instance 
var c = + +a; // same as above, same as +(+a) 
4

는 자바 스크립트 인터프리터는 increment operator로 본다.

+ +variable을 입력하면 자바 스크립트 인터프리터는 Unary plus으로보고 값을 숫자로 두 번 강제 변환합니다.

그래서

var a = 1; 
var b = +a; 
var c = +b; 

console.log(c);// still 1 

은 공간을 그렇게 만드는 그래서 간단한 대답은 두 더하기 기호가 점진로 해석 될 수있는 공간으로 분리 될 수 없다는 것입니다

var c = + +1; 

과 동일 통역사는 두 개의 별개의 공간을 봅니다. 실제로는 무엇입니까

+1

더 명백한'+ (+ 1)'과 동등합니다. – tadman

9

사양에 있습니다.

파고를 통해, 우리는 §14.6.2.2에서 단항 연산자를 사용하기 전에 증가 및 감소 연산자가 나열되어 있고 선호된다는 것을 알 수 있습니다. 우선 순위만으로는 설명 할 수 없습니다.

the punctuation table in §11.7을 보면 사양의 ++ (연산자)의 모든 단일 인스턴스가 공백없이 두 개를 함께 표시한다는 것을 알 수 있습니다. 당신이 확인 될 때까지 즉 특히, ...,

The whitespace rules in §11.2 결정적인 아니다 :

공백 코드 포인트는 상당한 코드 포인트로 간주됩니다 StringLiteral하는 RegularExpressionLiteral, 템플릿, 또는 TemplateSubstitutionTail 내에서 발생할 수있다 리터럴 값의 일부를 형성합니다. 주석 내에도 발생할 수 있지만 다른 종류의 토큰에는 나타날 수 없습니다.

JS는 임의의 공백 중간 연산자를 허용하지 않습니다.

PegJSEsprima의 JS 구문은 모두 리터럴 2 문자 문자열 ++에서 일치합니다.

0

매우 유사하게 보일 수도 있지만 + +++은 AST 해석기에서 전혀 똑같지 않습니다. 토큰 분리에도 동일하게 적용됩니다. varfoovar foo과 같지 않습니다.

+ + +i에서 각 x은 변수를 숫자로 변환하는 별개의 단항 연산자로 간주됩니다. 증분 작업 (++)의 경우 + 및 변수 토큰 사이에 공백이 허용되지 않습니다. 아래의 예에서, 마지막 줄은 유효하지 않습니다은`+`연산자로 선택 왼쪽 피연산자를 처리처럼

var x = "4"; 
 
console.log(+ + +x); 
 
console.log(+ + ++x); 
 
console.log(+ ++ +x);

관련 문제