Recently, I have got into a habit of calling things like RegExp, String, Number, Object, TypeError, etc without \"new\".
e.g:
throw (TypeError(\"Error\")
Be aware the result can be different.
For example, the Number constructor creates Number objects, but when called as a function it only does type coercion to primitive Number.
new Number(123); // Number { 123 }
Number(123); // 123
But yes, there are lots of the cases in which it doesn't matter whether you use new or not. They exist because of backwards compatibility, but with recently introduced constructors like Set or Map do require new.
In general, I would recommend using new when you want to create a new object. Then,
Boolean, Number or String without new.new, but it doesn't matter.Symbol without new.Boolean, Number, String or Symbol with new.Array, Object, RegExp, Error, etc., I would use new, but it doesn't matter.Set, Map, WeakSet, WeakMap, typed arrays, etc., you must call it with new.For the old constructors that it doesn't matter, it's like they call themselves with new if you omit it. For example, for RegExp,
When
RegExpis called as a function rather than as a constructor, it creates and initializes a new RegExp object. Thus the function callRegExp(…)is equivalent to the object creation expressionnew RegExp(…)with the same arguments.