Как насчет НЕ выбрасывать исключения и НЕ использовать медленное регулярное выражение?
return str1 != null && str2 != null
&& typeof str1 === 'string' && typeof str2 === 'string'
&& str1.toUpperCase() === str2.toUpperCase();
Приведенный выше фрагмент предполагает, что вы не хотите совпадать, если строка имеет значение null или не определена.
Если вы хотите сопоставить ноль / неопределенное значение, то:
return (str1 == null && str2 == null)
|| (str1 != null && str2 != null
&& typeof str1 === 'string' && typeof str2 === 'string'
&& str1.toUpperCase() === str2.toUpperCase());
Если по какой-то причине вы беспокоитесь о неопределенности против нуля:
return (str1 === undefined && str2 === undefined)
|| (str1 === null && str2 === null)
|| (str1 != null && str2 != null
&& typeof str1 === 'string' && typeof str2 === 'string'
&& str1.toUpperCase() === str2.toUpperCase());