오늘 콘솔에 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 인용문을 직접 추가했습니다. 콘솔은 사용자를 위해 수행 한 작업에 대한 정보를 제공하지 않습니다.
새로운 규칙은 엄청나게 간단 하여이 어려운 두 문자를 힘들게 입력 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]"
미쳤고 일관된 내가 처리 할 수있는 …