2012-05-04 2 views
3

내가 이해할 수없는 이상한 JavaScript를 발견했습니다. for 순환은 이상한 구문 (많은 매개 변수)을 가지고 있습니다. 어떻게 작동하는지 어떻게 설명 할 수 있습니까? 덕분에 일반 for 루프를하지만 첫 번째 부분에서 매우 긴 varJavascript에서 "for"사이클의 이상한 사용에 대해 설명해주세요.

decode: function(s){ 
     for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l; 
      ((a = s[i][c](0)) & 0x80) && 
      (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ? 
      o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "") 
     ); 
     return s.join(""); 
    } 
+1

Ewwwww ......... –

답변

2

흥미로운 기능, 분명히 가지 난해한 문자의 특정 세트를 트랜스 코딩 및 만 ASCII 코드로 작동하지만 여기에 고장입니다 :

for (var i = 0; i < s.length; i++) { 
     var a = s.charCodeAt(i); 

     if (a & 0x80) { // (a >= 128) if extended ascii 

      var b = s.charCodeAt(i + 1); 

      var specialA = (a & 0xfc) === 0xc0; // a IS [À, Á, Â or Ã] essentially [192, 193, 194, 195] 
      var specialB = (b & 0xc0) === 0x80; // b >= 128 & b <= 191 eg. b is not a special Latin Ascii Letter 

      if (specialA && specialB) { 

       var txA = (a & 0x03) << 6; // [0, 64, 128, 192] 
       var txB = b & 0x3f; // 0 - 63 

       s[i] = String.fromCharCode(txA + txB); 

      } else { 
       s[i] = String.fromCharCode(128); 
       s[++i] = ""; 
      } 
     } 
    } 

이것이 도움이 되었기를 바랍니다. 흥미로운 디코딩을 발견했거나, 원시 어셈블러를 생각 나게하는 LOL -ck

+0

흥미로운 디코딩 기술 n_n – ajax333221

+0

감사합니다. 이제 매우 명확합니다! ** 유니 코드 ** 형식의 문자열을 디코딩하는 함수 여야합니다 (예 : é를 é로 디코딩해야 함) – niente3

5

.

그것은 그냥 또한

var a, b, c; 

루프에 대한 조작 많은 대신에 실제로 몸을 가지고 루프를 포함에 반복자 문

있다.

이 기능은 끔찍한 프로그래머가 읽을 수있는 코드를 고려하지 않고 작성했거나 의도적으로 축소하고 난독화한 것입니다.

+0

아니면 그렇게하는 데 약간의 성과 (실제 또는 상상)가있었습니다. –

+0

@ codemonkey : 끔찍한 프로그래머는 그것을 쓸 수 없었습니다. – SLaks

+2

@SLaks 틀렸어. 좋은 프로그래머는 거기에 모든 변수를 설정하지 않습니다. 훌륭한 프로그래머는 가독성을 고려합니다. –

1

for 루프의 다른 부분이 모두 세미콜론 (;)으로 나뉩니다.

var에 부분 :

var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; 

체크 부분 :

++i < l; 

업데이트 부분 다음 for() 문 후

((a = s[i][c](0)) & 0x80) && 
     (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ? 
     o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "") 

는 것을 의미 당장 ;를 오는 루프에는 본문이 없지만 var-, check의 모든 문 - 및 업데이트 부분은 검사가 더 이상 true이 될 때까지 계속 실행됩니다.

다른 사람이 보이지 않는 것 같습니다 코드를 읽을 수있게하려고합니다. 어쨌든 어디서 찾았 니?

1

가독성 하나에 루프 속보 :

  • 재배치 루프 파라미터
  • if(...){(...)}
  • 으로 (...)&&(...) 변화가 lenl 변경
  • len
외부 s = s.split(...) 이동

.


  • var a, b, s = s.split(""), o = String.fromCharCode, c = "charCodeAt"; 
    
    for(var i = -1, len = s.length; ++i < len;){ 
        if((a = s[i][c](0)) & 0x80){ 
         (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ? o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = ""); 
        } 
    } 
    

    i는 초기 값을 변경하며
  • 외부

a = s[i][c](0) 이동을 증가 곳/방법.


  • var a, b, s = s.split(""), o = String.fromCharCode, c = "charCodeAt"; 
    
    for(var i = 0, len = s.length; i < len; i++){ 
        a = s[i][c](0); 
    
        if(a & 0x80){ 
         s[i] = (a & 0xfc); 
         (s[i] == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ? o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = ""); 
        } 
    } 
    
    if(...){s[++i] = "";}
  • (s[i] == 0xc0 && tmp, s[++i] = "");을 갈라
  • tmp
  • 에 삼항 연산 결과를 저장 읽는 일을 쉽게하기 위해 tmp을 만든 귀하의 예제 안에 새로운 루프를 교체

.

decode: function(s){ 
    var tmp, a, b, s = s.split(""), o = String.fromCharCode, c = "charCodeAt"; 

    for(var i = 0, len = s.length; i < len; i++){ 
     a = s[i][c](0); 

     if(a & 0x80){ 
      s[i] = (a & 0xfc); 

      if(((b = s[i + 1][c](0)) & 0xc0) == 0x80){ 
       tmp = o(((a & 0x03) << 6) + (b & 0x3f)); 
      }else{ 
       tmp = o(128); 
      } 

      if(s[i] == 0xc0 && tmp){ 
       s[++i] = ""; 
      } 
     } 
    } 

    return s.join(""); 
} 

최종 결과/\

관련 문제