console.dir과 console.log의 차이점은 무엇입니까?


357

Chrome에서 console객체는 동일한 작업을 수행하는 두 가지 방법을 정의합니다.

console.log(...)
console.dir(...)

온라인에서 어딘가 dir에서 오브젝트를 복사하기 전에 오브젝트의 사본 을 가져 오는 반면 log콘솔에 참조를 전달하기 만하면 로깅 한 오브젝트를 검사 할 때 오브젝트가 변경되었을 수 있습니다. 그러나 일부 예비 테스트에 따르면 아무런 차이가 없으며 둘 다 기록되었을 때와는 다른 상태의 객체가 표시 될 가능성이 있습니다.

Chrome 콘솔 ( Ctrl+ Shift+ J) 에서이 기능을 사용해보십시오 .

> o = { foo: 1 }
> console.log(o)
> o.foo = 2

이제 [Object]로그 문 아래를 확장하고 foo값이 2로 표시 되는지 확인하십시오 . dir대신을 사용하여 실험을 반복하는 경우에도 마찬가지 입니다 log.

내 질문은, 왜이 두 겉보기에 동일한 기능이 존재 console합니까?


65
시도 console.log([1,2])하고 console.dir([1,2])차이를 볼 수 있습니다.
Felix Kling

Firebug에서 로그 된 객체의 내용은 console.dir변경되지 않으므로 큰 차이가 있습니다.
유진 야마 쉬

3
에주의 하시고 console.dir():이 기능은 표준이 아닌 ! 생산에 사용하지 마십시오;)
fred727


1
@ user7393973 좋은 찾기! 실제로 이미지는 아래 답변 에서 얻은 것이므로 실제로 랩톱에서 캡처되었습니다. MDN에 뭔가를 돌려주는 것이 좋습니다. 정말 훌륭한 자원입니다.
Drew Noakes

답변:


352

Firefox에서는 이러한 기능이 다르게 작동 log합니다. toString표현 만 인쇄하고 dir탐색 가능한 트리를 인쇄합니다.

Chrome에서 log 이미 대부분 나무를 인쇄합니다 . 그러나 Chrome log은 속성이 있더라도 특정 클래스의 객체를 여전히 엄격하게 나타냅니다. 아마도 가장 분명한 차이의 예는 정규식입니다.

> console.log(/foo/);
/foo/

> console.dir(/foo/);
* /foo/
    global: false
    ignoreCase: false
    lastIndex: 0
    ...

당신은 또한 (예를 들어, 배열과 명확한 차이를 볼 수 console.dir([1,2,3])있습니다) log다른 정상 개체에서 검정 고시를 :

> console.log([1,2,3])
[1, 2, 3]

> console.dir([1,2,3])
* Array[3]
    0: 1
    1: 2
    2: 3
    length: 3
    * __proto__: Array[0]
        concat: function concat() { [native code] }
        constructor: function Array() { [native code] }
        entries: function entries() { [native code] }
        ...

다른 답변에서 언급했듯이 DOM 객체는 다른 동작을 나타냅니다 .


11
console.dir이 객체에 대한 참조를 유지한다는 것을 잊지 마십시오. 프로덕션 환경에서 광범위하게 사용하고 싶지 않을 것입니다. 콘솔이 tho로 표시된 경우에만 작동합니다.
Jean-Philippe Leclerc

Ubuntu의 Chromium 45에서는 트리 console.logtoString아닌 단순화 된 "Firefox"버전 인 것 같습니다 . 나는 그들이 언제 그것을 바꾸 었는지 확실하지 않지만, 그렇게했다.
icedwater

3
@icedwater : 전화를 걸 console.log거나 나중에 열 때 콘솔을 열 었는지 여부에 따라 다릅니다 . 네 진짜로 요. :-)
TJ Crowder 2016 년

기능과의 명확한 차이점도 볼 수 있습니다. 크롬에서는을 사용하여 함수 소스 코드를 인쇄 console.log하지만을 사용 console.dir하면 prototype, arguments속성을 볼 수 있습니다.
Tina Chen

1
지금은 그런 것 console.log하고 console.dir실제로에서 같은 표현을 반환 [1,2,3]파이어 폭스에서.
xji

151

Chrome에서 또 다른 유용한 차이점은 콘솔에 DOM 요소를 보낼 때 존재합니다.

주의:

  • console.log HTML과 같은 트리에서 요소를 인쇄합니다
  • console.dir JSON과 같은 트리에서 요소를 인쇄합니다.

특히 console.logDOM 요소에 특별한 처리를 제공하는 반면console.dir 그렇지는 않습니다. 이것은 종종 DOM JS 객체의 전체 표현을 보려고 할 때 유용합니다.

Chrome 콘솔 API 참조에는 이 기능 및 기타 기능에 대한 자세한 정보가 있습니다.



11
@ loneshark99 실제로는 다른 방법입니다. 스크린 샷에서 URL을 확인 하시겠습니까? 그들은 내 대답을 복사했습니다. 그러나 그것은 SO 답변에 대한 라이센스로 허용되며 어쨌든 MDN을 좋아하기 때문에 괜찮습니다.
Drew Noakes

내가 처음에 생각했던 것이지만 왜 그들이 여기에서 복사 할 것인지 생각했습니다. 맞는 말이다 . 좋은 정보
loneshark99

4

Firebug는 Chrome의 개발 도구와 다르게 작동한다고 생각합니다. Firebug는 객체의 문자열 버전을 제공하는 것처럼 보입니다.console.dir 제공 확장 가능한 객체 제공 . 둘 다 Chrome에서 확장 가능한 객체를 제공하며 혼란이 생길 ​​수 있다고 생각합니다. 또는 Chrome의 버그 일뿐입니다.

Chrome에서는 둘 다 동일한 작업을 수행합니다. 테스트에서 확장하면 Chrome에서 객체를 확장하면 현재 객체 값을 얻는 것으로 나타났습니다.

> o = { foo: 1 }
> console.log(o)
Expand now, o.foo = 1
> o.foo = 2
o.foo is still displayed as 1 from previous lines

> o = { foo: 1 }
> console.log(o)
> o.foo = 2
Expand now, o.foo = 2

다음을 사용하여 원하는 버전의 객체를 얻을 수 있습니다. 이 줄을 호출 할 때가 아니라이 줄이 호출 될 때의 객체가 무엇인지 보여줍니다.

console.log(JSON.stringify(o));



0

Felix Klings의 조언에 따라 크롬 브라우저에서 시도했습니다.

console.dir([1,2]) 다음과 같은 출력을 제공합니다.

Array[2]
 0: 1
 1: 2
 length: 2
 __proto__: Array[0]

while console.log([1,2])은 다음과 같은 출력을 제공합니다.

[1, 2]

따라서 console.dir()배열 및 객체에서 프로토 타입 등과 같은 더 많은 정보를 얻는 데 사용해야 한다고 생각 합니다.


0

차이 사이 console.log()console.dir():

간단히 말해서 차이점은 다음과 같습니다.

  • console.log(input): 브라우저는 적절한 형식으로 기록합니다
  • console.dir(input): 브라우저는 모든 속성을 가진 개체 만 기록합니다

예:

다음 코드 :

let obj = {a: 1, b: 2};
let DOMel = document.getElementById('foo');
let arr = [1,2,3];

console.log(DOMel);
console.dir(DOMel);

console.log(obj);
console.dir(obj);

console.log(arr);
console.dir(arr);

Google 개발자 도구에 다음을 기록합니다.

여기에 이미지 설명을 입력하십시오


0

7 개 이전 답변 없음은 언급되지 console.dir지원 추가 인수를 : depth, showHidden, 및 사용 여부colors .

depth(이론적으로) 개체를 console.log지원 하는 기본 2 개 이상의 수준으로 개체를 탐색 할 수있게하는 것이 특히 중요 합니다.

나는 몽구스 객체와 달렸다을했을 때 나는 때문에 실제로는 "이론적으로"작성 console.log(mongoose)console.dir(mongoose, { depth: null })출력이 동일했다. 실제로 mongoose객체 깊이 재발 한 것은 다음을 사용하는 것입니다 util.inspect.

import * as util from 'util';
console.log(util.inspect(myObject, {showHidden: false, depth: null}));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.