Javascript中String()和new String()的区别
Posted
技术标签:
【中文标题】Javascript中String()和new String()的区别【英文标题】:Difference between String() and new String() in Javascript 【发布时间】:2018-10-09 11:23:19 【问题描述】:在 javascript 中使用 String()
和 new String()
有什么区别吗?
console.log(String('word')); // word
console.log(new String('word')); // word
【问题讨论】:
请注意,字符串原始类型的 String 对象包装器很大程度上是由于历史原因而存在的,实际用途有限,并且效率低于使用原始字符串值。另见***.com/q/17256182/5217142 【参考方案1】:使用String()
构造函数没有 new
为您提供传递参数的字符串(原始)值。这就像在必要时将参数装箱在本机对象中(如数字或布尔值),然后在其上调用 .toString()
。 (当然,如果你传递一个普通的对象引用,它只会调用.toString()
。)
调用 new String(something)
会生成一个 String 实例对象。
console.log()
的结果看起来相同,因为它只会从您传递给它的 String 实例中提取原始字符串。
所以:简单的String()
返回一个字符串原语。 new String(xyz)
返回一个由 String 构造函数构造的对象。
很少显式地构造一个 String 实例。
【讨论】:
谢谢@Pointy。那么 String('something') 和 'something' 是一样的吗?我只是在看这个答案:***.com/questions/17256182/… 是的,特别是使用字符串原语调用普通的String()
会返回该字符串原语。这是一个幂等无操作。
更实际地new String("word") == new String("word")
将是false
,因为它们是两个不同的对象,而String("word") == String("word")
将是true
,因为您正在比较primitives【参考方案2】:
String() 返回一个原始字符串,而 new String() 返回一个 Object String。 这对您的代码有一些实际影响。
-
将 String() 与其他带有 == 和 === 运算符的原语一起使用会返回“true”。
使用 String() 为您提供了一个原语,因此它不能使用“instanceOf”方法来检查其类型。您只能使用“typeof”运算符检查值类型
使用带有 String 或 Object 原型的“instanceOf”方法的 new String() - 两者都断言为真。
使用 new String() 只会通过调用 valueOf() 方法返回带有字符串原语的 'true'。 String() 也有这个方法,并且在与相同值的字符串比较时返回 true。
使用 new String() 允许您向 Object 添加一些其他属性和方法,以实现更复杂的行为。
根据我的编码经验如果您不需要向字符串对象添加特殊方法,则应避免使用 new String()。
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"
【讨论】:
谢谢。我还补充一点new String('') === new String('')
是 false
!!
@Mir-Ismaili 添加到答案中! :D 谢谢!【参考方案3】:
String
在非构造函数上下文中调用返回的字符串(即不使用 new
关键字)是原始字符串。
使用new String()
(构造函数模式)创建的字符串是一个对象,可以在其中存储属性。
展示差异:
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
【讨论】:
谢谢@Mamun。那么添加属性是您选择使用 new String() 的主要原因吗? @cham,因为它们之间除了类型之外没有其他区别,当我需要它们作为对象时,我会使用new String()
.....谢谢。【参考方案4】:
除了已经提供的好的答案之外,还有一个示例:
var x = String('word');
console.log(typeof x); // "string"
var y = new String('word');
console.log(typeof y); // "object"
您的问题的确切答案在the documentation 中。
字符串字面量(用双引号或单引号表示)和字符串 从
String
在非构造函数上下文中调用返回(即,没有 使用 new 关键字)是原始字符串。
【讨论】:
【参考方案5】:一般不建议使用构造函数(即使用new
关键字),因为它会导致不可预知的结果。
例如:
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)')
另外,如上所述,还有一个潜在的问题:
typeof 0; // number
typeof Number(0) // number
typeof new Number(0) // object
【讨论】:
以上是关于Javascript中String()和new String()的区别的主要内容,如果未能解决你的问题,请参考以下文章
javascript中var s=new fun; 和var s=new fun();有啥区别?
Javascript中String()与new String()的差异
JAVA中String s = "hello"和String s = new String("hello")有啥区别啊?
java中String s = new String("abc")创建了几个对象