source

왜 ('b'+'a'+'a'+'a'+'a')의 결과가 Lower Case()의 '바나나'로 되어 있습니까?

manycodes 2022. 10. 26. 21:10
반응형

왜 ('b'+'a'+'a'+'a'+'a')의 결과가 Lower Case()의 '바나나'로 되어 있습니까?

내가 자바스크립트를 연습하고 있을 때 내 친구 중 한 명이 이 자바스크립트 코드를 발견했다.

document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());

위의 코드가 응답합니다."banana"왜 그런지 설명해줄 사람?

+'a'로 해결하다.NaN('숫자 아님')는 문자열이 숫자에 강제로 입력되는 반면 문자는a를 숫자로 구문 분석할 수 없습니다.

document.write(+'a');
To lowercase it becomes 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'

('Operator precedence' 참조)

(+'a')변환 시도'a'단항 더하기 연산자를 사용하여 숫자로 변환합니다.왜냐면'a'는 숫자가 아닙니다.결과는 다음과 같습니다("Not a Number") :

'b'  +  'a'  +  NaN  + 'a'

비록 ~일지라도NaN는 "Not a Number"의 약자로, 여전히 숫자 유형입니다. 문자열에 추가하면 다른 숫자와 마찬가지로 연결됩니다.

'b'  +  'a'  +  NaN  + 'a'  =>  'baNaNa'

마지막으로 소문자를 사용합니다.

'baNaNa'.toLowerCase()      =>  'banana'
('b' + 'a' + + 'a' + 'a').toLowerCase()

알기 쉽게 하기 위해서, 이것을 2개의 스텝으로 나누어 봅시다.먼저 괄호로 묶인 식의 값을 얻은 다음,toLowerCase()그 결과에 따라 기능합니다.

순서 1

'b' + 'a' + + 'a' + 'a'

L-R에는 다음이 있습니다.

  • 'b' + 'a'ba를 반환합니다.이것은 일반 연결입니다.
  • ba + + 'a'ba와 연결시키려는 시도+ 'a'단, 단항 연산자가+오퍼랜드를 숫자로 변환하려고 하면 NaN 이 반환되고 원래 ba와 연결되면 문자열로 변환되므로 baN이 발생합니다.
  • baNaN+ 'a'는 baNa를 반환합니다.다시 말씀드리지만, 이것은 정기적인 연결입니다.

이 단계에서 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'))

마지막으로 Lower Case()로 변환되므로 바나나가 됩니다.

그 옆에 번호를 붙이면 결과가 바뀝니다.

( '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자 이상입니다."
  • 추가 연산자( + ) "추가 연산자는 문자열 연결 또는 숫자 추가를 수행합니다."

실행되는 암묵적인 액션은 문자열 상의 To Number 호출입니다.

  • 문자열 유형에 적용되는 ToNumber "Strings에 적용되는 ToNumber는 입력 문자열에 문법을 적용합니다.문법이 StringNumericLiteral의 확장으로 String을 해석할 수 없는 경우 ToNumber의 결과는 NaN입니다.

인터프리터에는 표현식을 왼쪽 및 오른쪽 표현식의 컴포넌트로 분할하여 해석하는 방법에 대한 규칙이 있습니다.


1: 서 1:'b' + 'a'

식: 쪽쪽쪽:'b'
값: ' 쪽 : 'b'

연산자: + (식측 중 하나가 문자열이므로 문자열 연결)

바른른 right right:'a' 값: ' 바 ' : 'a'

★★★★★'ba'


2: 서 2 2:'ba' + + 'a'

식: 쪽쪽쪽:'ba'
값: ' 쪽 : 'ba'

연산자: + (식측 중 하나가 문자열이므로 문자열 연결)

바른른 right right:+ 'a'기호에서 .) ('a'는 플러스 기호에서 기호로 계산됩니다.) ('a'는 플러스 기호로 계산됩니다.) (''는기호로 됩니다.) 마이너스 기호도 여기서 음수를 나타내므로 NaN이 됩니다.)
오른쪽 값 : NaN ('ToString'으로 변경)

결과: 'baNaN'


3: § 3:'baNaN' + 'a'

식: 쪽쪽쪽:'baNaN'
값: ' 쪽 ': 'baNaN'

연산자: + (식측 중 하나가 문자열이므로 문자열 연결)

바른른 right right:'a'
값: ' 바 ' : 'a'

결과: 'baNaNa'


그 후 그룹식이 평가되고 to Lower Case가 호출되어 바나나가 남습니다.

+를 사용하면 JavaScript에서 모든 값이 숫자로 변환됩니다!

그래서...

할 은 '어느 정도 알고 배울 수 있다'입니다.+JavaScript의 어떤 값보다 먼저 해당 값을 숫자로 변환하지만, 해당 값을 변환할 수 없는 경우 JavaScript 엔진은 NaN을 반환합니다. 즉, 숫자(숫자로 변환할 수 없음, mate!)와 다음과 같은 나머지 스토리를 반환합니다.

('b'+'a'+'a'+'a'+'a')의 결과는 왜 Lower Case()'banana'로 되어 있습니까?

여기에 이미지 설명 입력

W3Schools 또는 Mozilla Developer Network에서 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-a-a-tolowercase-banana

반응형