Reputation: 10722
In JavaScript is there any difference between using String()
and new String()
?
console.log(String('word')); // word
console.log(new String('word')); // word
Upvotes: 29
Views: 9835
Reputation: 20571
Generally it's not recommended to use constructor functions (i.e. using new
keyword) because it can lead to unpredictable results.
For example:
if (new Number(0)) { //
console.log('It will be executed because object always treated as TRUE in logical contexts. If you want to treat 0 as falsy value then use Number(0)')
}
Also, as mentioned above, there is another potential problem:
typeof 0; // number
typeof Number(0) // number
typeof new Number(0) // object
Upvotes: 2
Reputation: 1607
String() returns a string primitive and new String() returns a Object String. This has some real consequences for your code.
From my coding experience you should avoid using new String() if you have no need for adding special methods to your String Object.
var x = String('word');
console.log(typeof x); // "string"
var y = new String('word');
console.log(typeof y); // "object"
// compare two objects !!!
console.log(new String('') === new String('')) // false!!!
// compare with string primitive
console.log('' == String('')) // true
console.log('' === String('')) // true
//compare with string Object
console.log('' == new String('')) // true
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
console.log('' === new String('')) // false !!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// instance of behavior
console.log(x instanceof String); // false
console.log(x instanceof Object); // false
// please note that only new String() is a instanceOf Object and String
console.log(y instanceof String); // true
console.log(y instanceof Object); // true
//valueOf behavior
console.log('word' == x.valueOf()); // true
console.log('word' === x.valueOf()); // true
console.log('word' == y.valueOf()); // true
console.log('word' === y.valueOf()); // true
//create smart string
var superString = new String('Voice')
superString.powerful = 'POWERFUL'
String.prototype.shout = function () {
return `${this.powerful} ${this.toUpperCase()}`
};
console.log(superString.shout()) //"POWERFUL VOICE"
Upvotes: 15
Reputation: 68933
Strings returned from String
calls in a non-constructor context (i.e., without using the new
keyword) are primitive strings.
Strings created with new String()
(constructor mode) is an object and can store property in them.
Demonstrating the difference:
var strPrimitive = String('word');
strPrimitive.prop = "bar";
console.log(strPrimitive.prop); // undefined
var strObject = new String('word');
strObject.prop = "bar";
console.log(strObject.prop); // bar
Upvotes: 7
Reputation: 12139
Here is an example in addition to the good answers already provided:
var x = String('word');
console.log(typeof x); // "string"
var y = new String('word');
console.log(typeof y); // "object"
The exact answer to your question is here in the documentation.
String literals (denoted by double or single quotes) and strings returned from
String
calls in a non-constructor context (i.e., without using the new keyword) are primitive strings.
Upvotes: 3
Reputation: 413720
Using the String()
constructor without new
gives you the string (primitive) value of the passed parameter. It's like boxing the parameter in a native object if necessary (like a Number or Boolean), and then calling .toString()
on it. (Of course if you pass a plain object reference it just calls .toString()
on that.)
Calling new String(something)
makes a String instance object.
The results look the same via console.log()
because it'll just extract the primitive string from the String instance you pass to it.
So: just plain String()
returns a string primitive. new String(xyz)
returns an object constructed by the String constructor.
It's rarely necessary to explicitly construct a String instance.
Upvotes: 22