내 친구 중 한 명이이 JavaScript 코드를 발견했을 때 JavaScript를 연습하고있었습니다.
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
위의 코드가 대답합니다 "banana"
! 아무도 이유를 설명 할 수 있습니까?
+'a'
스스로 작성 하고 무슨 일이 일어나는지보십시오.
내 친구 중 한 명이이 JavaScript 코드를 발견했을 때 JavaScript를 연습하고있었습니다.
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
위의 코드가 대답합니다 "banana"
! 아무도 이유를 설명 할 수 있습니까?
+'a'
스스로 작성 하고 무슨 일이 일어나는지보십시오.
답변:
+'a'
로 확인 NaN
문자가하면서, 문자열을 숫자로 강제 변환하기 때문에 ( "숫자가 아님") a
숫자로 분석 할 수 없습니다.
document.write(+'a');
banana
.
추가 NaN
로 "ba"
턴 NaN
문자열로 "NaN"
인해 형식 변환, 제공합니다 baNaN
. 그리고 a
뒤에는 포기가 baNaNa
있습니다.
사이의 공백 + +
은 첫 번째 문자열 연결과 두 번째 문자열을 단항 더하기 (예 : "긍정") 연산자로 만드는 것입니다. 를 사용 'ba'+(+'a')+'a'
하면로 해결 되는 동일한 결과 를 얻습니다.이 유형은 저글링으로 인해 'ba'+NaN+'a'
동일합니다 'ba'+'NaN'+'a'
.
document.write('ba'+(+'a')+'a');
'b' + 'a' + + 'a' + 'a'
...로 평가됩니다.
('b') + ('a') + (+'a') + ('a')
( 우선 순위 연산자 참조 )
(+'a')
단항 더하기 연산자를'a'
사용하여 숫자 로 변환하려고 시도합니다 . 숫자가 아니기 때문에 결과는 ( "Not-A-Number" )입니다.'a'
NaN
'b' + 'a' + NaN + 'a'
NaN
"숫자가 아님"을 나타내지 만 여전히 숫자 유형입니다 . 문자열에 추가되면 다른 숫자와 마찬가지로 연결됩니다.
'b' + 'a' + NaN + 'a' => 'baNaNa'
마지막으로 소문자입니다.
'baNaNa'.toLowerCase() => 'banana'
('b' + 'a' + + 'a' + 'a').toLowerCase()
명확하게하기 위해 두 단계로 나누어 봅시다. 먼저 괄호로 묶은 표현식의 값을 얻은 다음 toLowerCase()
결과에 함수를 적용합니다 .
'b' + 'a' + + 'a' + 'a'
LR으로 가면 다음과 같습니다.
'b' + 'a'
ba를 반환합니다 . 이것은 정규 연결입니다.ba + + 'a'
와 ba 를 연결하려고 시도합니다 + 'a'
. 그러나 단항 연산자 이후 +
의 시도는 다수의 값으로 피연산자를 변환하는 NaN의 일본어로 연결될 때 다음 문자열로 변환되고, 반환되며 BA - 따라서 결과 baNaN .baNaN
+ 'a'는 baNaNa를 반환합니다 . 다시, 이것은 규칙적인 연결입니다.
이 단계에서 1 단계의 결과는 baNaNa 입니다.
.toLowerCase()
1 단계에서 리턴 된 값에 적용 하면 다음이 제공됩니다.
바나나
JavaScript에는 체크 아웃 할 수있는 많은 유사한 말장난 이 있습니다.
+ 연산자 때문입니다 .
청크로부터 더 많은 지식을 얻을 수 있습니다.
=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator
Which later on try to convert next character to the number.
예를 들어
const string = '10';
두 가지 방법으로 문자열을 숫자로 변환 할 수 있습니다.
원래 쿼리로 돌아가십시오. 여기서 다음 문자 ( 'a')를 숫자로 변환하려고 시도하지만 갑자기 오류 NaN이 발생합니다.
( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))
그러나 이전 문자가 문자열에 있었기 때문에 문자열로 취급됩니다. 그래서 그것은
( ('b') + ('a') + 'NaN' + ('a'))
마지막으로 LoLoCase ()로 변환하므로 바나나가됩니다.
옆에 숫자를 넣으면 결과가 변경됩니다.
( 'b' + 'a' + + '1' + 'a' )
'ba1a'입니다
const example1 = ('b' + 'a' + + 'a' + 'a').toLowerCase(); // 'banana'
const example2 = ('b' + 'a' + + '1' + 'a').toLowerCase(); // 'ba1a'
console.log(example1);
console.log(example2);
이 코드 줄은 식을 평가 한 다음 반환 된 값을 기준으로 메서드를 호출합니다.
식은 ('b' + 'a' + + 'a' + 'a')
문자열 리터럴과 덧셈 연산자로만 구성됩니다.
- 문자열 리터럴 "문자열 리터럴은 작은 따옴표 나 큰 따옴표로 묶은 0 개 이상의 문자입니다."
- 더하기 연산자 (+) "더하기 연산자는 문자열 연결 또는 숫자 추가를 수행합니다."
내재 된 조치는 문자열에서 ToNumber를 호출하는 것입니다.
- 문자열 유형에 적용된 ToNumber "문자열에 적용된 ToNumber는 입력 문자열에 문법을 적용합니다. 문법이 문자열을 StringNumericLiteral의 확장으로 해석 할 수없는 경우 ToNumber의 결과는 NaN입니다."
인터프리터는 표현식을 왼쪽 및 오른쪽 표현식의 구성 요소로 분류하여 표현식을 구문 분석하는 방법에 대한 규칙을 가지고 있습니다.
1 단계: 'b' + 'a'
왼쪽 표현 : 'b'
왼쪽 값 : 'b'
연산자 : + (표현식 중 하나는 문자열이므로 문자열 연결)
올바른 표현 : 'a'
올바른 가치 : 'a'
결과: 'ba'
2 단계: 'ba' + + 'a'
왼쪽 표현 : 'ba'
왼쪽 값 : 'ba'
연산자 : + (표현식 중 하나는 문자열이므로 문자열 연결)
올바른 표현 : + 'a'
(이것은 문자 'a'의 수학 값이 + 부호에서 양수인 것으로 가정합니다-빼기 부호는 여기서 음수를 나타내는 것으로 작동하여 NaN이됩니다)
올바른 값 : NaN (연산자가 문자열 연결이므로 연결 중에이 값에서 toString이 호출 됨)
결과 : 'baNaN'
3 단계 : 'baNaN' + 'a'
왼쪽 표현 : 'baNaN'
왼쪽 값 : 'baNaN'
연산자 : + (표현식 중 하나는 문자열이므로 문자열 연결)
올바른 표현 : 'a'
올바른 가치 : 'a'
결과 : 'baNaNa'
이 후 그룹화 표현식이 평가되고 toLowerCase가 호출되어 바나나가 남습니다.
W3Schools 또는 Mozilla 개발자 네트워크 에서 NaN에 대해 자세히 알아보십시오
+"a"
입니다NaN
.