( '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
"Not a Number"의 약자 이지만 여전히 숫자 유형입니다 . 문자열에 추가되면 다른 숫자와 마찬가지로 연결됩니다.
'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'
연결하는 시도를 바 로+ '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'))
그리고 마지막으로 그것을 toLowerCase ()로 변환합니다. 그래서 그것은 바나나가 될 것입니다.
옆에 숫자를 넣으면 결과가 바뀝니다.
( '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'
Left Expression: 'baNaN'
Left Value: 'baNaN'
Operator: + (one of the expression sides is a string, so string concatenation)
Right Expression: 'a'
Right Value: 'a'
Result: 'baNaNa'
After this the grouping expression has been evaluated, and toLowerCase is called which leaves us with banana.
Using + will convert any value to Number in JavaScript!
So...
The main thing here to know first and learn from is using +
before any value in JavaScript, will convert that value to a number, but if that value can not be converted, JavaScript engine will return NaN, which means, not a number (can not be converted to a number, mate!) and the rest of story as below:
Read more about NaN at W3Schools or Mozilla Developer Network
See the magic here. Second plus is an unary operator which gives '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-a-a-tolowercase-banana
'IT박스' 카테고리의 다른 글
JavaScript를 통해 도메인 간 POST 요청을 보내려면 어떻게합니까? (0) | 2020.10.04 |
---|---|
WPF에서 x : Name 및 Name 특성의 차이점은 무엇입니까? (0) | 2020.10.04 |
프로세스 내부에서 CPU 및 메모리 사용량을 확인하는 방법은 무엇입니까? (0) | 2020.10.04 |
내 프로그램이 충돌 할 때 자동으로 스택 추적을 생성하는 방법 (0) | 2020.10.04 |
값에 대해 여러 변수를 테스트하는 방법은 무엇입니까? (0) | 2020.10.03 |