Typescript中String和new String的区别是什么?



在Typescript中String()new String()的区别是什么?如果混合使用或使用其中一种,我们可能会遇到什么问题?

我知道如果我们比较两个字符串那么它们将相等,就像

String('hello') === 'hello' // returns true

字符串字量(由双引号或单引号表示)和在非构造函数上下文中(即不使用new关键字调用)调用String返回的字符串是基本字符串。JavaScript会自动将原语转换为String对象,这样就可以对原语字符串使用String对象方法。在对原语字符串调用方法或发生属性查找的上下文中,JavaScript将自动包装字符串原语并调用该方法或执行属性查找。

let s_prim = 'foo'
let s_obj = new String(s_prim)
console.log(typeof s_prim) // Logs "string"
console.log(typeof s_obj)  // Logs "object"

String原语和String对象在使用eval()时会给出不同的结果。传递给eval的原语被视为源代码;通过返回字符串对象,将字符串对象视为所有其他对象。例如:

let s1 = '2 + 2'              // creates a string primitive
let s2 = new String('2 + 2')  // creates a String object
console.log(eval(s1))         // returns the number 4
console.log(eval(s2))         // returns the string "2 + 2"

由于这些原因,代码可能会在遇到String对象时中断,而不是期望原始字符串,尽管通常情况下,作者不必担心这种区别。

String对象总是可以通过valueOf()方法转换为它的原始对象。

console.log(eval(s2.valueOf()))  // returns the number 4

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String string_primitives_and_string_objects

最新更新