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


575

내 친구 중 한 명이이 JavaScript 코드를 발견했을 때 JavaScript를 연습하고있었습니다.

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

위의 코드가 대답합니다 "banana"! 아무도 이유를 설명 할 수 있습니까?


22
두 번째 플러스는 단항 연산자 +"a"입니다 NaN.
Gerardo Furtado 19 :

8
콘솔에서 +'a'스스로 작성 하고 무슨 일이 일어나는지보십시오.
일부 프로그래머 친구

23
그리고 더 열망하는 사람들을 위해. 참조 전체 재미리스트
경솔한 나야에게

4
강력 관련 : stackoverflow.com/q/9032856
Kyll

답변:


566

+'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');


90
'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'

36
('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에는 체크 아웃 할 수있는 많은 유사한 말장난 이 있습니다.


24

+ 연산자 때문입니다 .

청크로부터 더 많은 지식을 얻을 수 있습니다.

=> ( ('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'))

마지막으로 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);


9

이 코드 줄은 식을 평가 한 다음 반환 된 값을 기준으로 메서드를 호출합니다.

식은 ('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가 호출되어 바나나가 남습니다.


7

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

그래서...

여기에서 중요한 것은 먼저 알고 사용하고 배울 +자바 스크립트에서 값 전에 숫자로 그 값을 변환합니다 ,하지만 값을 변환 할 수없는 경우, 자바 스크립트 엔진이 돌아갑니다 NaN의 수단, 숫자가 아님 (수 없습니다 다음과 같이 숫자, 메이트!) 및 나머지 이야기로 변환하십시오.

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



0

여기서 마술을보십시오. 두 번째 플러스는 'NaN'을 제공하는 단항 연산자입니다

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.