2017-09-15 6 views
0

어떻게 경고 (++ [[]] [+ []] + [+ []]); 0으로 계산? 이 프로세스에 대한 자세한 내용은 다음을 참조하십시오.어떻게 경고 (++ [[]] [+ []] + [+ []]); 0으로 계산?

+0

시도 하시겠습니까? 더 많은 것을 설명해주세요. – Bhargav

+0

실제로 jsfiddle에서 10입니다! : 0 @Bhargav ... 호기심이라고 생각합니다. JS가 여기에 계산하는 이유를 알고 싶습니다. – CodeHacker

+3

[JSFUCK] (https://en.wikipedia.org/wiki/JSFuck)를 ​​참조하십시오.) –

답변

4

++[[]][+[]]+[+[]]은 실제로 '10' 문자열을 반환합니다. 의 그것을 분해 보자

1 단계 : +[]

이 문자 그대로 하늘의 배열 뒤에 단항 플러스 연산자입니다. 단항 플러스는 그 뒤에 오는 값을 정수로 변환하려고 시도합니다.

+[]; // 0 

// This is identical: 
Number([]); // 0 

리턴 값 [].toString() 호출하고 Number() 그 결과를 제공하는 것과이다 :이 경우에 값은 배열이다. [].toString()은 빈 문자열 ('')을 반환하고 Number('')0을 반환합니다.

Array.prototype.toString

Array 객체는 객체의 toString 메소드를 재정의합니다. Array 객체의 경우 toString 메서드는 배열을 조인하고 각 배열 요소가 쉼표로 구분 된 하나의 문자열을 반환합니다.

Number.

비 생성자 컨텍스트 (즉, new 연산자 없음)에서는 Number을 사용하여 유형 변환을 수행 할 수 있습니다. 우리는 소스 0+[]의 발행 수를 변경할 때

그래서 우리는 얻을 :

++[[]][0] + [0] 

2 단계 : [[]][0]

본 공정은 단순한 배열 부재 액세스 동작이다 : 하나의 중첩 된 (빈) 배열이있는 배열이 먼저 정의 된 다음 [0]으로 첫 번째 중첩 배열에 액세스합니다.이 배열은 단순히 []을 반환합니다.

++[] + [0] 

3 단계 : 우리는 표현의 부품을 교체한다면, 우리는 얻을

다음 숫자로 <value>를 변환하고, 할 수있는 ++ <value> 운영자 시도 ++[]는 그 번호를 증가 이 예제에서 숫자로 배열을 변환하는 절차는 이 1 단계에 있었던 것과 같은 방식으로 발생합니다. []은 먼저 문자열 (배열이 비어 있기 때문에이 경우 '')로 변환 된 다음 번호, 다시 retu rns 0. 마지막으로 0은 을 반환하는 1만큼 증가합니다.우리는 표현의 부품을 교체 그래서, 우리가 얻을 :

1 + [0] 

4 단계 : 1 + [0]

이 이야기의 이상한 부분입니다. 위 정보가 주어지면이 값이 정수 1으로 평가 되겠지만 실제로는 문자열 '10'으로 평가됩니다. 이것은 위의 예제에서 배열의 유형 변환에 대한 2 단계 (처음부터 문자열로, 다음으로 숫자로) 때문입니다. 배열은 항상 수식 연산자 (즉, 수학 계산)의 피연산자이므로이 두 단계가 필요했습니다. 그러나 + 연산자는 산술 + 연산자 또는 문자열 연결 연산자로 사용할 수 있으며 후자는 항상 우선 순위를 갖습니다. 하나의 피연산자가 이미 문자열이기 때문에

은 그래서 빨리 [0]가 문자열로 변환되는 한, + 운영자에게 주어진 두 피연산자가 문자열로 변환됩니다. 표현식을 변환 된 피연산자로 바꾸면 다음과 같이 표현식을 평가하는 마지막 단계가됩니다.

'1' + '0'; // '10' 
+0

@ Jeffrey Westerkamp는이 코드에 우선 순위가 없습니다. 일반적으로이 코드에만 적용되는 것이 아닙니다. –

+0

내 프로젝트 중 _, 대답은 분명히 아니오입니다. 이 스 니펫은 JS의 단점을 이해하는 데 도움이되는 단순한 퍼즐로 간주되어야합니다. 제 생각에는 결코 실제 시나리오에서 이런 종류의 '마법'을 사용하지 마십시오. –

+0

괜찮습니다. 고맙습니다 –