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")创建了几个对象

Java 中String s="你好" 跟 String s=new String("你好")有啥区别

String s = new String("abc");在内存中有几个对象?