왜 ( 'b'+ 'a'+ + 'a'+ 'a'). toLowerCase () 'banana'의 결과입니까?
내 친구 중 한 명이이 JavaScript 코드를 발견했을 때 JavaScript를 연습하고있었습니다.
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
위의 코드가 대답합니다 "banana"
! 아무도 이유를 설명 할 수 있습니까?
+'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()
결과에 함수를 적용합니다 .
1 단계
'b' + 'a' + + 'a' + 'a'
LR으로 가면 다음과 같습니다.
'b' + 'a'
ba를 반환합니다 . 이것은 정규 연결입니다.ba + + 'a'
와 ba 를 연결하려고 시도합니다+ 'a'
. 그러나 단항 연산자 이후+
의 시도는 다수의 값으로 피연산자를 변환하는 NaN의 일본어로 연결될 때 다음 문자열로 변환되고, 반환되며 BA - 따라서 결과 baNaN .baNaN
+ 'a'는 baNaNa를 반환합니다 . 다시, 이것은 규칙적인 연결입니다.
이 단계에서 1 단계의 결과는 baNaNa 입니다.
2 단계
.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가 호출되어 바나나가 남습니다.
+를 사용하면 JavaScript에서 모든 값을 숫자로 변환합니다!
그래서...
여기에서 중요한 것은 먼저 알고 사용하고 배울 +
자바 스크립트에서 값 전에 숫자로 그 값을 변환합니다 ,하지만 값을 변환 할 수없는 경우, 자바 스크립트 엔진이 돌아갑니다 NaN의 수단, 숫자가 아님 (수 없습니다 다음과 같이 숫자, 메이트!) 및 나머지 이야기로 변환하십시오.
W3Schools 또는 Mozilla 개발자 네트워크 에서 NaN에 대해 자세히 알아보십시오
여기서 마술을보십시오. 두 번째 플러스는 'NaN'을 제공하는 단항 연산자입니다
console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());
참고 URL : https://stackoverflow.com/questions/57456188/why-is-the-result-of-ba-aa-tolowercase-banana
'Programing' 카테고리의 다른 글
SQL Server 트랜잭션 로그를 지우려면 어떻게합니까? (0) | 2020.02.09 |
---|---|
배경 아래에 나타나는 부트 스트랩 모달 (0) | 2020.02.09 |
JavaScript를 통해 도메인 간 POST 요청을 보내려면 어떻게합니까? (0) | 2020.02.09 |
WPF에서 x : Name과 Name 특성의 차이점은 무엇입니까? (0) | 2020.02.09 |
프로세스 내부에서 CPU 및 메모리 소비를 확인하는 방법은 무엇입니까? (0) | 2020.02.09 |