@@ -134,6 +134,9 @@ const builtInObjects = new Set(
134
134
ObjectGetOwnPropertyNames ( global ) . filter ( ( e ) => / ^ [ A - Z ] [ a - z A - Z 0 - 9 ] + $ / . test ( e ) )
135
135
) ;
136
136
137
+ // https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot
138
+ const isUndetectableObject = ( v ) => typeof v === 'undefined' && v !== undefined ;
139
+
137
140
// These options must stay in sync with `getUserOptions`. So if any option will
138
141
// be added or removed, `getUserOptions` must also be updated accordingly.
139
142
const inspectDefaultOptions = ObjectSeal ( {
@@ -482,7 +485,7 @@ function getEmptyFormatArray() {
482
485
function getConstructorName ( obj , ctx , recurseTimes , protoProps ) {
483
486
let firstProto ;
484
487
const tmp = obj ;
485
- while ( obj ) {
488
+ while ( obj || isUndetectableObject ( obj ) ) {
486
489
const descriptor = ObjectGetOwnPropertyDescriptor ( obj , 'constructor' ) ;
487
490
if ( descriptor !== undefined &&
488
491
typeof descriptor . value === 'function' &&
@@ -680,7 +683,9 @@ function findTypedConstructor(value) {
680
683
// value afterwards again.
681
684
function formatValue ( ctx , value , recurseTimes , typedArray ) {
682
685
// Primitive types cannot have properties.
683
- if ( typeof value !== 'object' && typeof value !== 'function' ) {
686
+ if ( typeof value !== 'object' &&
687
+ typeof value !== 'function' &&
688
+ ! isUndetectableObject ( value ) ) {
684
689
return formatPrimitive ( ctx . stylize , value , ctx ) ;
685
690
}
686
691
if ( value === null ) {
0 commit comments