diff --git a/crates/oxc_ecmascript/src/constant_evaluation/mod.rs b/crates/oxc_ecmascript/src/constant_evaluation/mod.rs index 79722b5ae..d61b729cd 100644 --- a/crates/oxc_ecmascript/src/constant_evaluation/mod.rs +++ b/crates/oxc_ecmascript/src/constant_evaluation/mod.rs @@ -352,22 +352,17 @@ pub trait ConstantEvaluation<'a> { if left.may_have_side_effects() { return None; } - - let left_ty = ValueType::from(left); - if left_ty == ValueType::Undetermined { - return None; - } - if left_ty == ValueType::Object { - if let Some(right_ident) = right.get_identifier_reference() { - if right_ident.name == "Object" && self.is_global_reference(right_ident) { - return Some(ConstantValue::Boolean(true)); - } + if let Some(right_ident) = right.get_identifier_reference() { + let name = right_ident.name.as_str(); + if matches!(name, "Object" | "Number" | "Boolean" | "String") + && self.is_global_reference(right_ident) + { + return Some(ConstantValue::Boolean( + name == "Object" && ValueType::from(left).is_object(), + )); } - None - } else { - // Non-object types are never instances. - Some(ConstantValue::Boolean(false)) } + None } _ => None, } diff --git a/crates/oxc_ecmascript/src/constant_evaluation/value_type.rs b/crates/oxc_ecmascript/src/constant_evaluation/value_type.rs index c9493729c..2d37e1785 100644 --- a/crates/oxc_ecmascript/src/constant_evaluation/value_type.rs +++ b/crates/oxc_ecmascript/src/constant_evaluation/value_type.rs @@ -40,6 +40,10 @@ impl ValueType { pub fn is_boolean(self) -> bool { self == Self::Boolean } + + pub fn is_object(self) -> bool { + self == Self::Object + } } /// `get_known_value_type` diff --git a/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs b/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs index 5fb999ad3..2800bdf30 100644 --- a/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs +++ b/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs @@ -1609,6 +1609,7 @@ mod test { // An unknown value should never be folded. test_same("x instanceof Foo"); + test_same("0 instanceof Foo"); } #[test]