IT박스

( 'b'+ 'a'+ + 'a'+ 'a'). toLowerCase () 'banana'의 결과는 무엇입니까?

itboxs 2020. 10. 4. 10:43
반응형

( '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';

다음 두 가지 방법으로 문자열을 숫자로 변환 할 수 있습니다.

  1. 숫자 (문자열);
  2. + 문자열;

따라서 원래 쿼리로 돌아갑니다. 여기서는 다음 문자 ( '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:

Why is the result of ('b'+'a'+ + 'a' + 'a').toLowerCase()'banana'?


enter image description here

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

반응형