[javascript] Chrome 콘솔에서 {} + {}가 더 이상 NaN이 아닌 이유는 무엇인가요?

오늘 콘솔에 NaN입력 할 때 Chrome 49가 더 이상 출력되지 않는 것으로 나타났습니다 {}+{}. 대신 문자열을 출력합니다 [object Object][object Object].

왜 이런거야? 언어가 바뀌 었습니까?



답변

Chrome devtools는 이제 암시 적으로 괄호 쌍으로 시작 {하고 끝나는 모든 것을 자동으로 래핑 하고 }( code 참조 ), 평가를 표현식으로 강제합니다. 그런 식으로 {}빈 객체를 만듭니다. 이력 ( ) 으로 돌아 가면 이전 줄이에 포함됩니다 (…).

왜? 잘 모르겠지만, 블록 대 객체 리터럴을 모르는 초보자에게는 혼란을 줄일 수 있다고 생각할 수 있습니다. 표현식을 평가하고 싶다면 더 도움이됩니다.

그리고 실제로 버그 499864 에서 논의 된 바와 같이 추론 입니다. 순수한 편의성. 그리고 노드 REPL도 그것을 가지고 있기 때문에 ( code 참조 ).


답변

이 확인 후 위쪽 화살표를 공격하는 경우, 당신은 대신 것을 알 수 있습니다 {} + {}그것을 표시 ({} + {}), 결과를 "[object Object][object Object]".

이에 비해 Firefox에서는 {} + {}여전히을 표시 NaN하지만 그렇게 ({} + {})하면을 표시합니다 "[object Object][object Object]".

따라서 Chrome 이이 작업을 볼 때 주변 괄호를 자동으로 추가하는 것처럼 보입니다.


답변

콘솔과 관련하여 Chrome 54 기준 :

?- "블록을 개체로 변환했습니다"-Clippy
불행히도 Clippy 인용문을 직접 추가했습니다. 콘솔은 사용자를 위해 수행 한 작업에 대한 정보를 제공하지 않습니다.

새로운 규칙은 엄청나게 간단 하여이 어려운 두 문자를 힘들게 입력 o=하거나 0,오브젝트 리터럴을 콘솔에 붙여 넣기 전에 어려움을 덜어줍니다 .

  • 다음으로 시작하는 코드가있는 경우 : 선택적 공백, (주석이 허용되지 않음) 뒤에 {;
  • 그 코드는 객체로 해석 될 수 있습니다.
  • 다음과 같은 경우가 아니면 해당 객체 뒤에 다른 코드가 없습니다.
  • 첫 번째 객체 다음의 코드는 이진 연산자입니다.
  • 그룹화를 포함하여 원하는만큼 많은 작업을 수행 할 수 있습니다.
  • 최종 연산자가 오른쪽 위치에 Object 리터럴이있는 경우;
  • 그 최종 객체는 괄호 안에 그룹화되지 않았습니다
  • 그 코드는 세미콜론으로 끝나지 않습니다
  • 코드 뒤에 주석이 없습니다 (내부 주석은 초기 또는 최종 위치에 있지 않는 한 허용됩니다)
  • 그래야만 자바 스크립트 (실제로 유효한 코드 일 수도 있고 아닐 수도 있음)가 유효한 객체로 다시 표시됩니다. 코드가 해석되었다는 알림을받지 않습니다.

{wat:1}),({wat:2} 마지막으로 다시 오류입니다.

{let i=0;var increment=_=>i++} 마지막으로 올바르게 허용되며 이는 클로저를 수행하는 아주 좋은 방법입니다.

그러나 다음은 잘못 된 객체입니다. @ Bergi에서 언급 한 것처럼 편리합니다 .JS가 잘못 해석하여 도움을줍니다! 스펙은 아무것도 지정되지 않은 리터럴 1로 레이블이 지정된 명령문 “foo”가있는 블록입니다.

{foo:1}

위와 동일해야합니다

if(1) {
    foo: 1
}

다음은 앞에 주석이 있기 때문에 블록으로 올바르게 취급됩니다!

//magic comment
{foo:1}

이것도 마찬가지입니다 :

{foo:1}
//also magic

이것은 객체입니다.

{foo:
//not so magic comment
1}

이것은 오류입니다

//not so magic comment
{foo:1}.foo

이것도 마찬가지입니다 :

{foo:1}.foo

이건 괜찮아:

1..wat

undefined

이것도 마찬가지입니다 :

['foo'][0]

다음은 표현 위치로 엉망이 된 객체로 올바르게 해석됩니다 0,.

0,{foo:1}.foo

왜 그들이 그 가치를 괄호 안에 싸는 지 모르겠습니다. JS는 우스운 디자인 결정을 가지고 있지만이 상황에서 더 잘 행동하게 만드는 것은 실제로 옵션이 아니며 콘솔은 JS를 올바르게 실행해야하며 크롬은 우리가 생각한다고 생각하지 않을 것이라고 확신해야합니다 실제로 다른 일을하는 것을 의미했습니다.

쉼표 연산자가 마음에 들지 않으면 할당을 사용할 수 있습니다

x = {foo:1}.foo

그것이 서 있기 때문에

{} + {} + {}

"[object Object][object Object][object Object]"

;{} + {} + {}

"NaN[object Object]"

미쳤고 일관된 내가 처리 할 수있는 …


답변