在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